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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzFlMjYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M2M2I2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU0NDc0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRkOGM5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+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/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU0M2QxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOGRmZDcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0Ci0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0IFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3MmY5Zi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRkZDY5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1NWNkZS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+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+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYWM4MGYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMy4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE0ZTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODk4Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIgdmVyc2lvbj0iMi4zLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NzM3Mi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzBhOWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ1ZjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhYmU2Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhYjEyNS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKUEEgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzBhOWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ1ZjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NWQzZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY5MTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M3ZDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNTowOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzljY2IuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNhMDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTREsgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gUHJvamVjdAotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LTA5IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM4N2Y2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZWIyZjAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNTgzNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo0NyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjAwOTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZGY5MDkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTdjYmQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5icmFuZGluZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmZlYXR1cmUiIHZlcnNpb249IjEuNy4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5mZWF0dXJlIiB2ZXJzaW9uPSIxLjcuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmZlYXR1cmUiIHZlcnNpb249IjEuNy4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubGFuZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjEuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLm9ybyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuOC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuamRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnZlbG9jaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuNS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQxN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ODU0Ny4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGRhZDMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWEwNDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgMjAwOCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MTdmZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGIxZDUwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDg1NDcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc2MGYyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhNGRjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhNGM0My4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTViZjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IkRhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBKVW5pdCBUZXN0cyIKLSAgICAgIHZlcnNpb249IjIuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY1ZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmVfMS4wLjEuKgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGE3NTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YWI4ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjU1MzYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUGx1Zy1pbiBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIFByb2plY3QKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LTA5IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDIzZjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZG9jLmlzdiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NzM3Mi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTliZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MDkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZmMDhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5pbmkgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODIxZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYsIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwODliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJjMjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhZGQyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhNWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhN2RiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMToyMiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyYzI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1OTo0MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGQ4ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi51aQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU2OTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjQ4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2MxN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREIgVUkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyYjgxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aS53aXphcmQuTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIHdhcyBjYW5jZWxsZWQuCi0JICogVGhlIG5hbWUgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSBmcm9tCi0JICogSnB0RGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCQlOZXdKREJDRmlsdGVyZWRDUFdpemFyZCAgd2l6YXJkID0gbmV3IE5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHZpZXdlciBmaWx0ZXIgKioqKioqKioqKgotLy8KLS8vCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0vLwotLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlMb2NhbFZpZXdlckZpbHRlcigpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoQ1BXaXphcmROb2RlKSBlbGVtZW50OwotLy8JCQlJUHJvZmlsZVdpemFyZFByb3ZpZGVyIHdpemFyZFByb3ZpZGVyID0gd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpOwotLy8JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotLy8JCQkJCQkJKChQcm9maWxlV2l6YXJkUHJvdmlkZXIpIHdpemFyZFByb3ZpZGVyKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0vLwkJCQotLy8JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLS8vCQkJd2hpbGUgKGNhdGVnb3J5ICE9IG51bGwpIHsKLS8vCQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhEQVRBQkFTRV9DQVRFR09SWV9JRCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkuZ2V0UGFyZW50KCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3NWE0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWJiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTE6MDIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE3MTU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkdC5jbGFzc3BhdGg7YnVuZGxlLXZlcnNpb249IlsxLjAuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYiwKLSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yO3gtaW50ZXJuYWw6PXRydWUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRlYWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRjMzk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGIiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM0YTMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9DYXRhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2ZkMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgY2F0YWxvZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYXRhbG9nIGV4dGVuZHMgU2NoZW1hQ29udGFpbmVyIHsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlZTNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW4gZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RyYWludHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGl0cyB0YWJsZSdzIHByaW1hcnkga2V5LgotCSAqLwotCWJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHBhcnQgb2Ygb25lIG9mIGl0cyB0YWJsZSdzIGZvcmVpZ24ga2V5cy4KLQkgKi8KLQlib29sZWFuIGlzUGFydE9mRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGEgdW5pcXVlIGNvbnN0cmFpbnQgZGVmaW5lZCBmb3IgaXRzCi0JICogdGFibGUuCi0JICovCi0JYm9vbGVhbiBpc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbnVsbGFibGUuCi0JICovCi0JYm9vbGVhbiBpc051bGxhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgZGF0YXR5cGUuCi0JICovCi0JU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbidzIHR5cGUgaXMgbnVtZXJpYy4KLQkgKi8KLQlib29sZWFuIGlzTnVtZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBwcmVjaXNpb24gaWYgaXQgaXMgYSBOdW1lcmljYWxEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBzY2FsZSBpZiBpdCBpcyBhbiBFeGFjdE51bWVyaWNEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgY29sdW1uIGlzIGEgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUsIHJldHVybiBpdHMgbGVuZ3RoOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uJ3MgZGF0YXR5cGUgaXMgYSBMT0IgdHlwZQotCSAqIChpLmUuIEJMT0IsIENMT0IsIG9yIE5DTE9CKS4KLQkgKi8KLQlib29sZWFuIGlzTE9CKCk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JU3RyaW5nIGdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgYW5kIHN1aXRhYmxlIGZvciB1c2UgYXMgYQotCSAqIHByaW1hcnkga2V5IGZpZWxkLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBhbmQgc3VpdGFibGUgZm9yIHVzZSBhcyBhCi0JICogcHJpbWFyeSBrZXkgZmllbGQuCi0JICovCi0JSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThmM2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBBbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29ubmVjdGlvbkxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE1YjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbm5lY3Rpb25MaXN0ZW5lcjwvY29kZT4gaXMgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMgdG8gYSBjb25uZWN0aW9uLgotICogPHA+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0KLQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpOwotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZyk7Ci0JcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKTsKLQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpOwotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSk7Ci0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKTsKLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2YTdlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmpkYmMuSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIGRhdGFiYXNlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgaW5hY3RpdmUuCi0JICovCi0JRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBJRCBvZiB0aGUgcHJvdmlkZXIgbWFuYWdpbmcgdGhlIERUUCBwcm9maWxlLgotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlcklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHN0YXRpYyBJRC4KLQkgKi8KLQlTdHJpbmcgZ2V0SW5zdGFuY2VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBwcm9kdWN0IG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHZlcnNpb24uCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkcml2ZXIgY2xhc3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBVUkwuCi0JICovCi0JU3RyaW5nIGdldFVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHVzZXIgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB1c2VyIHBhc3N3b3JkLgotCSAqLwotCVN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGRlZmluaXRpb24uCi0JICovCi0JU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXIgbGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGFzIGEgCi0JICogY29tbWEtZGVsaW1pdGVkIHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIERyaXZlciBkZWZpbml0aW9uLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG9yIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gaXQgaGFzIGFjY2VzcyB0byBtZXRhLWRhdGEpLgotCSAqIEBzZWUgaXNDb25uZWN0ZWQoKQotCSAqIEBzZWUgaXNXb3JraW5nT2ZmbGluZSgpCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgbmVpdGhlciBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlCi0JICogc2Vzc2lvbiBub3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICogQHNlZSBpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNDb25uZWN0ZWQoKQotCSAqLwotCWJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgY29ubmVjdCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCBmcm9tIHRoZSBkYXRhYmFzZS4KLQkgKiBAc2VlICNjb25uZWN0KCkKLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBvZmYtbGluZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gdGhlIG1ldGEtZGF0YQotCSAqIGNvbWVzIGZyb20gYSBsb2NhbCBjYWNoZSksIGFzIG9wcG9zZWQgdG8gY29ubmVjdGVkIHRvIGEgbGl2ZQotCSAqIGRhdGFiYXNlIHNlc3Npb24uCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNXb3JraW5nT2ZmbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gZmFjdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUncyBwcm92aWRlciBzdXBwb3J0IHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCk7Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGZvciB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZS4KLQkgKiBJZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRvZXMgbm90IHN1cHBvcnQgd29ya2luZyBpbiBhbiBvZmZsaW5lIG1vZGUsIG5vCi0JICogZXhjZXB0aW9uIGlzIHRocm93biBhbmQgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlJU3RhdHVzIHNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc3VwcG9ydHMgd29ya2luZyBvZmZsaW5lIGFuZCBkYXRhCi0JICogaGFzIGJlZW4gc2F2ZWQgZm9yIHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIGNhbldvcmtPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBCZWdpbiB3b3JraW5nIG9mZi1saW5lLgotCSAqLwotCUlTdGF0dXMgd29ya09mZmxpbmUoKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlTdHJpbmcgQ09OTkVDVElPTl9QUk9GSUxFX1RZUEUgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlckRlZmluaXRpb25JRCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuZGVmblR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfSkFSX0xJU1RfUFJPUF9JRCA9ICJqYXJMaXN0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCA9IElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QUk9QX1BSRUZJWCArICJzYXZlUFdEIjsgIC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyYjU2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIEFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25Qcm9maWxlQWRhcHRlciBpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDFjNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUgZmFjdG9yeQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZXMgdGhlIGZhY3RvcnkgY2FuIHdyYXAgd2l0aAotCSAqIG5ldyBjb25uZWN0aW9uIHByb2ZpbGVzLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNvbm5lY3Rpb24gcHJvZmlsZSB0aGF0IHdyYXBzIHRoZSBEVFAgY29ubmVjdGlvbgotCSAqIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyb2wgaG93Ci0JICogZGF0YWJhc2UgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCB0byBuYW1lcyBhbmQgdmljZSB2ZXJzYS4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGFkYXB0ZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNvbm5lY3Rpb24gcHJvZmlsZSB0aGF0IHdyYXBzIHRoZSBEVFAgY29ubmVjdGlvbgotCSAqIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB3aGVuIGEgSlBBIHBsYXRmb3JtIGlzIHVuYXZhaWxhYmxlCi0JICogKGUuZy4gZHVyaW5nIHByb2plY3QgY3JlYXRpb24pLiBUaGUgcmV0dXJuZWQgY29ubmVjdGlvbiBwcm9maWxlIHdpbGwKLQkgKiB1c2UgdGhlIGRlZmF1bHQgY29udmVyc2lvbnMgZm9yIGlkZW50aWZpZXJzIGFuZCBuYW1lcy4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSBEVFAKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGVzLgotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjMxZTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogQSA8Y29kZT5Qcm9maWxlTGlzdGVuZXI8L2NvZGU+IGlzIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcy4KLSAqIDxwPgotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGFkZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiByZW5hbWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1ZmVhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0KLS8qKgotICogRGF0YWJhc2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2UgZXh0ZW5kcyBTY2hlbWFDb250YWluZXIgewotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UncyB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGdldFZlbmRvck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyB2ZXJzaW9uLgotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGNhdGFsb2dzLiBJZiBpdCBkb2VzLCBhbGwgZGF0YWJhc2UKLQkgKiBvYmplY3RzIGFyZSBjb250YWluZWQgYnkgdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZ3M7IG90aGVyd2lzZSBhbGwgZGF0YWJhc2UKLQkgKiBvYmplY3RzIGFyZSBjb250YWluZWQgYnkgdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEuCi0JICogPGJyPgotCSAqIFByYWN0aWNhbGx5IHNwZWFraW5nOjx1bD4KLQkgKiAgICAgPGxpPklmIHtAbGluayAjc3VwcG9ydHNDYXRhbG9ncygpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+PHVsPgotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0Q2F0YWxvZ3MoKX0gcmV0dXJucyBjYXRhbG9ncyB0aGF0IGNvbnRhaW4gdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEKLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldFNjaGVtYXRhKCl9IHJldHVybnMgYW4gZW1wdHkgaXRlcmFibGUKLQkgKiAgICAgPC91bD4KLQkgKiAgICAgPGxpPmVsc2U8dWw+Ci0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRDYXRhbG9ncygpfSByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhYmxlCi0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRTY2hlbWF0YSgpfSByZXR1cm5zIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhCi0JICogICAgIDwvdWw+Ci0JICogPC91bD4KLQkgKiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBhICJkZWZhdWx0IiBjYXRhbG9nIHRoYXQgY2xpZW50cyBjYW4KLQkgKiB1c2UgdG8gYWxsb3cgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBjYXRhbG9nIHRvIGJlIG9wdGlvbmFsOyBidXQgY2xpZW50cwotCSAqIG11c3QgbWFuYWdlIHRoaXMgZXhwbGljaXRseS4KLQkgKiAKLQkgKiBAc2VlICNnZXRDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0U2NoZW1hdGEoKQotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYWJsZSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlJdGVyYWJsZTxDYXRhbG9nPiBnZXRDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2F0YWxvZ3MgdGhlIGRhdGFiYXNlIGNvbnRhaW5zLgotCSAqIFJldHVybiB6ZXJvIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCWludCBnZXRDYXRhbG9nc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBjYXRhbG9nIG5hbWVzLCBzb3J0ZWQuCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhYmxlIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGEgY2F0YWxvZyBmcm9tIGEgcmVhZC1vbmx5Ci0JICogY29tYm8tYm94IChlLmcuIGluIGEgd2l6YXJkKS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dOYW1lZChTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2F0YWxvZyB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIGNhdGFsb2cncyBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dOYW1lcygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUNhdGFsb2cgZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBjYXRhbG9nIGlkZW50aWZpZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYW4gaWRlbnRpZmllciB0aGF0IHdpbGwgYmUKLQkgKiBwbGFjZWQgaW4gYSB0ZXh0IGZpbGUgKGUuZy4gaW4gYSBKYXZhIGFubm90YXRpb24pLgotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dOYW1lcygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dOYW1lZChTdHJpbmcpCi0JICovCi0JQ2F0YWxvZyBnZXRDYXRhbG9nRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgImRlZmF1bHQiIGNhdGFsb2csIGFzIGRlZmluZWQgYnkgdGhlIGRhdGFiYXNlIHZlbmRvci4KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGNhdGFsb2cncyBuYW1lIHdpbGwgbWF0Y2ggdGhlIHVzZXIgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncyBvciBpZiB0aGUgZGVmYXVsdAotCSAqIGNhdGFsb2cgZG9lcyBub3QgZXhpc3QgKGUuZy4gdGhlIGRhdGFiYXNlIGhhcyBubyBjYXRhbG9nIHdob3NlIG5hbWUKLQkgKiBtYXRjaGVzIHRoZSB1c2VyIG5hbWUpLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpCi0JICovCi0JQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzICJkZWZhdWx0IiBjYXRhbG9nIGlkZW50aWZpZXIuCi0JICogVGhlIGRhdGFiYXNlIG1heSBvciBtYXkgbm90IGhhdmUgYSBjYXRhbG9nIHdpdGggYSBtYXRjaGluZyBuYW1lLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldERlZmF1bHRDYXRhbG9nKCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogdXRpbGl0eSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFNlbGVjdCBhbmQgcmV0dXJuIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRhdGFiYXNlIG9iamVjdHMgdGhlCi0JICogZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgotCSAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBkZWxpbWl0ZWQgd2hlbgotCSAqIG5vbi0ibm9ybWFsIikuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgbmFtZSB0byBhIGRhdGFiYXNlLWFwcHJvcHJpYXRlIFNRTCBpZGVudGlmaWVyLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmMzdjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyBvZiB0aGUgRGFsaSBkYiBwYWNrYWdlIHRvIHBsdWcgaW4gYSBjdXN0b20KLSAqIHN0cmF0ZWd5IGZvciBjb252ZXJ0aW5nIGEgZGF0YWJhc2UgaWRlbnRpZmllciB0byBhIGRhdGFiYXNlIG5hbWUgYW5kIHZpY2UKLSAqIHZlcnNhLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiaWRlbnRpZmllciIgdG8gYSAibmFtZSIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAibmFtZSIgdG8gYW4gImlkZW50aWZpZXIiLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgRGVmYXVsdENhbGxiYWNrIGRlZmF1bHRDYWxsYmFjayk7Ci0KLQkvKioKLQkgKiBUaGUgY2xpZW50LXByb3ZpZGVkIGZpbmRlciBpcyBwYXNzZWQgYSAiZGVmYXVsdCIgY2FsbGJhY2sgdGhhdCBjYW4gYmUKLQkgKiB1c2VkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCWludGVyZmFjZSBEZWZhdWx0Q2FsbGJhY2sgewotCi0JCS8qKgotCQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImlkZW50aWZpZXIiIHRvIGEgIm5hbWUiLgotCQkgKi8KLQkJU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCQkvKioKLQkJICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJuYW1lIiB0byBhbiAiaWRlbnRpZmllciIuCi0JCSAqLwotCQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBhZGFwdGVyIHNpbXBseSB1c2VzIHRoZSBwYXNzZWQgaW4gZGVmYXVsdCBjYWxsYmFjay4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHVzZSB0aGUgZGVmYXVsdCBjYWxsYmFjawotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdENhbGxiYWNrLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKGlkZW50aWZpZXIpOwotCQl9Ci0JCS8vIHNpbXBseSB1c2UgdGhlIGRlZmF1bHQgY2FsbGJhY2sKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgRGVmYXVsdENhbGxiYWNrIGRlZmF1bHRDYWxsYmFjaykgewotCQkJcmV0dXJuIGRlZmF1bHRDYWxsYmFjay5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1NDM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogQ29tbW9uIGJlaGF2aW9yIHRvIGFsbCBkYXRhYmFzZSBvYmplY3RzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyAiaWRlbnRpZmllciIsIHdoaWNoIGlzIHRoZSBvYmplY3QncyBuYW1lCi0JICogbW9kaWZpZWQgc28gaXQgY2FuIGJlIHVzZWQgaW4gYW4gU1FMIHN0YXRlbWVudCAoZS5nLiBpZiB0aGUgbmFtZSBjb250YWlucwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycyBvciBpcyBtaXhlZCBjYXNlLCBpdCB3aWxsIGJlIGRlbGltaXRlZCwgdHlwaWNhbGx5IGJ5Ci0JICogZG91YmxlLXF1b3RlcykuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIG9iamVjdCdzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCi0JICogImRlZmF1bHQgbmFtZSIuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBvbGQgZW50aXR5IGdlbmVyYXRpb24gY29kZSB0byBkZXRlcm1pbmUgd2hldGhlcgotCSAqIGEgZ2VuZXJhdGVkIGFubm90YXRpb24gbXVzdCBleHBsaWNpdGx5IGlkZW50aWZ5IGEgZGF0YWJhc2Ugb2JqZWN0Ci0JICogKGUuZy4gYSB0YWJsZSkgb3IgdGhlIHNwZWNpZmllZCBkZWZhdWx0IGFkZXF1YXRlbHkgaWRlbnRpZmllcyB0aGUgZGF0YWJhc2Ugb2JqZWN0Ci0JICogKHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gY2FzZS1zZW5zaXRpdml0eSBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgZGVmYXVsdE5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyAiaWRlbnRpZmllciIsIHdoaWNoIGlzIHRoZSBvYmplY3QncyBuYW1lCi0JICogbW9kaWZpZWQgc28gaXQgY2FuIGJlIHVzZWQgaW4gYW4gU1FMIHN0YXRlbWVudCAoZS5nLiBpZiB0aGUgbmFtZSBjb250YWlucwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycyBvciBpcyBtaXhlZCBjYXNlLCBpdCB3aWxsIGJlIGRlbGltaXRlZCwgdHlwaWNhbGx5IGJ5Ci0JICogZG91YmxlLXF1b3RlcykuCi0JICovCi0JU3RyaW5nIGdldElkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgZGF0YWJhc2UuCi0JICovCi0JRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQotCUNvbXBhcmF0b3I8RGF0YWJhc2VPYmplY3Q+IERFRkFVTFRfQ09NUEFSQVRPUiA9Ci0JCQluZXcgQ29tcGFyYXRvcjxEYXRhYmFzZU9iamVjdD4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0MSwgRGF0YWJhc2VPYmplY3QgZGJPYmplY3QyKSB7Ci0JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGJPYmplY3QxLmdldE5hbWUoKSwgZGJPYmplY3QyLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VPYmplY3QuREVGQVVMVF9DT01QQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0KLQlUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPiBOQU1FX1RSQU5TRk9STUVSID0KLQkJCW5ldyBUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShEYXRhYmFzZU9iamVjdCBkYk9iamVjdCkgewotCQkJCQlyZXR1cm4gZGJPYmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlT2JqZWN0Lk5BTUVfVFJBTlNGT1JNRVIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQotCVRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+IElERU5USUZJRVJfVFJBTlNGT1JNRVIgPQotCQkJbmV3IFRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0KSB7Ci0JCQkJCXJldHVybiBkYk9iamVjdC5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VPYmplY3QuSURFTlRJRklFUl9UUkFOU0ZPUk1FUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Gb3JlaWduS2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Gb3JlaWduS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWRhZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRm9yZWlnbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIERhdGFiYXNlIGZvcmVpZ24ga2V5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvcmVpZ25LZXkgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldEJhc2VUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzICJyZWZlcmVuY2VkIiB0YWJsZS4KLQkgKi8KLQlUYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW5QYWlyPiBnZXRDb2x1bW5QYWlycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycy4KLQkgKi8KLQlpbnQgZ2V0Q29sdW1uUGFpcnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3Mgc2luZ2xlIGNvbHVtbiBwYWlyLiBUaHJvdyBhbgotCSAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHRoZSBmb3JlaWduIGtleSBoYXMgbW9yZSB0aGFuIG9uZSBjb2x1bW4gcGFpci4KLQkgKi8KLQlDb2x1bW5QYWlyIGdldENvbHVtblBhaXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgY29sdW1ucy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW4+IGdldEJhc2VDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGJhc2UKLQkgKiB0YWJsZSdzIHByaW1hcnkga2V5LiAoVGhlIG5vbi1wcmltYXJ5IGtleSBiYXNlIGNvbHVtbnMgYXJlIG5vdCB1c2VkIHRvCi0JICogZ2VuZXJhdGUgYmFzaWMgYXR0cmlidXRlcyBkdXJpbmcgZW50aXR5IGdlbmVyYXRpb24uKQotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0Tm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgInJlZmVyZW5jZWQiIGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZvcmVpZ24ga2V5IHJlZmVyZW5jZXMgdGhlIHByaW1hcnkga2V5IG9mIHRoZQotCSAqICJyZWZlcmVuY2VkIiB0YWJsZSBhbmQgdGhhdCBwcmltYXJ5IGtleSBoYXMgb25seSBhIHNpbmdsZSBjb2x1bW4uCi0JICogVGhpcyBjYW4gYmUgdXNlZCB3aGVuIGRldGVybWluaW5nIEpQQSBkZWZhdWx0cy4KLQkgKi8KLQlib29sZWFuIHJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCk7Ci0KLQotCS8vICoqKioqKioqKiogSlBBIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIG5hbWUgZm9yIGFuIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBlbnRpdHkKLQkgKiBtYXBwZWQgdG8gdGhlIGZvcmVpZ24ga2V5J3MgInJlZmVyZW5jZWQiIHRhYmxlLgotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgbmFtZSBvZiB0aGUgImJhc2UiIGNvbHVtbiBhZGhlcmVzIHRvIHRoZSBKUEEgc3BlYyBmb3IgYQotCSAqIGRlZmF1bHQgbWFwcGluZyAoaS5lLiBpdCBlbmRzIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSB0aGUgbmFtZQotCSAqIG9mIHRoZSAicmVmZXJlbmNlZCIgY29sdW1uLCBhbmQgdGhlICJyZWZlcmVuY2VkIiBjb2x1bW4gaXMgdGhlIHNpbmdsZQotCSAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgInJlZmVyZW5jZWQiIHRhYmxlKSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogZGVmYXVsdCBhdHRyaWJ1dGUgbmFtZTo8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqIDwvcHJlPgotCSAqIFJldHVybiBhIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGFkaGVyZSB0byB0aGUgSlBBIHNwZWM6PHByZT4KLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRV9JRCA9PiBDVUJJQ0xFLkNVQklDTEVfSUQpID0+IG51bGwKLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRSA9PiBDVUJJQ0xFLklEKSA9PiBudWxsCi0JICogPC9wcmU+Ci0JICovCi0JU3RyaW5nIGdldERlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSB0aGF0IGlzIG1hcHBlZCB0byB0aGUKLQkgKiBmb3JlaWduIGtleSwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiA8Y29kZT5AamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbidzIDxjb2RlPm5hbWU8L2NvZGU+IGVsZW1lbnQuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBqb2luIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqIDxwPgotCSAqIFByZWNvbmRpdGlvbjogVGhlIGZvcmVpZ24ga2V5IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNvbHVtbiBwYWlyIHdob3NlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgb2YgdGhlIGZvcmVpZ24KLQkgKiBrZXkncyByZWZlcmVuY2VkIHRhYmxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgb2xkIGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSB0aGUgam9pbiBjb2x1bW4KLQkgKiBvciB0aGUgY2FsY3VsYXRlZCBkZWZhdWx0IGFkZXF1YXRlbHkgaWRlbnRpZmllcyB0aGUgam9pbiBjb2x1bW4KLQkgKiAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5IGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMpLgotCSAqLwotCVN0cmluZyBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFpciB1cCB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMsIG1hdGNoaW5nIGVhY2ggImJhc2UiIGNvbHVtbiB3aXRoCi0JICogdGhlIGFwcHJvcHJpYXRlICJyZWZlcmVuY2VkIiBjb2x1bW4uCi0JICogQHNlZSAjY29sdW1uUGFpcnMoKQotCSAqLwotCWludGVyZmFjZSBDb2x1bW5QYWlyIHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gcGFpcidzICJiYXNlIiBjb2x1bW4uCi0JCSAqLwotCQlDb2x1bW4gZ2V0QmFzZUNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgInJlZmVyZW5jZWQiIGNvbHVtbi4KLQkJICovCi0JCUNvbHVtbiBnZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0KLQkJQ29tcGFyYXRvcjxDb2x1bW5QYWlyPiBCQVNFX0NPTFVNTl9DT01QQVJBVE9SID0KLQkJCQluZXcgQ29tcGFyYXRvcjxDb2x1bW5QYWlyPigpIHsKLQkJCQkJcHVibGljIGludCBjb21wYXJlKENvbHVtblBhaXIgY3AxLCBDb2x1bW5QYWlyIGNwMikgewotCQkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShjcDEuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSwgY3AyLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQkJcmV0dXJuICJGb3JlaWduS2V5LkNvbHVtblBhaXIuQkFTRV9DT0xVTU5fQ09NUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX07Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0pwdERiUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9KcHREYlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmVjZmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0pwdERiUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamR0LmNsYXNzcGF0aC5Ecml2ZXJDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBKUFQgREIgcGx1Zy1pbiBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24uCi0gKiBHbG9iYWxseSBhdmFpbGFibGUgY29ubmVjdGlvbiBwcm9maWxlIGZhY3RvcnkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RGJQbHVnaW4gSU5TVEFOQ0U7ICAvLyBzb3J0YS1maW5hbAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIERCIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHREYlBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHREYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aGlzIGNvbnZlbnRpb24gaXMgKndhY2sqLi4uICB+Ymp2Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuaW5zdGFuY2UoKTsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdG9wKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ID0gbnVsbDsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGphciBsaXN0IGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIERUUCBkcml2ZXIuCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhDb250YWluZXIgYnVpbGREcml2ZXJDbGFzc3BhdGhDb250YWluZXJGb3IoU3RyaW5nIGRyaXZlck5hbWUpIHsKLQkJcmV0dXJuIG5ldyBEcml2ZXJDbGFzc3BhdGhDb250YWluZXIoZHJpdmVyTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TY2hlbWEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBmZDJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogRGF0YWJhc2Ugc2NoZW1hCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgY29udGFpbmVyOyBlaXRoZXIgYSBjYXRhbG9nIG9yIGEgZGF0YWJhc2UuCi0JICovCi0JU2NoZW1hQ29udGFpbmVyIGdldENvbnRhaW5lcigpOwotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIHRhYmxlcy4KLQkgKi8KLQlJdGVyYWJsZTxUYWJsZT4gZ2V0VGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YWJsZXMgdGhlIHNjaGVtYSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0VGFibGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHRhYmxlJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCSBUYWJsZSBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgdGFibGUgaWRlbnRpZmllcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIEBzZWUgI2dldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogQHNlZSAjZ2V0VGFibGVOYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpCi0JICovCi0JVGFibGUgZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBzZXF1ZW5jZXMuCi0JICovCi0JSXRlcmFibGU8U2VxdWVuY2U+IGdldFNlcXVlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIHRoZSBzY2hlbWEgY29udGFpbnMuCi0JICovCi0JaW50IGdldFNlcXVlbmNlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2Ugd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhbiBleGFjdCBtYXRjaAotCSAqIG9mIHRoZSBzZXF1ZW5jZSdzIG5hbWUuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlTZXF1ZW5jZSBnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3Mgc2VxdWVuY2UgaWRlbnRpZmVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTZXF1ZW5jZUlkZW50aWZpZXJzKCkKLQkgKi8KLQlTZXF1ZW5jZSBnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TY2hlbWFDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJjOGQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogU2NoZW1hICJjb250YWluZXIiIChpLmUuIERhdGFiYXNlIG9yIENhdGFsb2cpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbnRhaW5lciBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3Mgc2NoZW1hdGEuCi0JICovCi0JSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2NoZW1hdGEgaW4gdGhlIGNvbnRhaW5lci4KLQkgKi8KLQlpbnQgZ2V0U2NoZW1hdGFTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYSBuYW1lcywgc29ydGVkLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGEgc2NoZW1hIGZyb20gYSByZWFkLW9ubHkKLQkgKiBjb21iby1ib3ggKGUuZy4gaW4gYSB3aXphcmQpLgotCSAqIEBzZWUgI2dldFNjaGVtYU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhbiBleGFjdCBtYXRjaAotCSAqIG9mIHRoZSBzY2hlbWEncyBuYW1lLgotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzY2hlbWEgaWRlbnRpZmllcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGFuIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlCi0JICogcGxhY2VkIGluIGEgdGV4dCBmaWxlIChlLmcuIGluIGEgSmF2YSBhbm5vdGF0aW9uKS4KLQkgKiBAc2VlICNnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFOYW1lcygpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0U2NoZW1hTmFtZWQoU3RyaW5nKQotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgImRlZmF1bHQiIHNjaGVtYSwgYXMgZGVmaW5lZCBieSB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgc2NoZW1hJ3MgbmFtZSB3aWxsIG1hdGNoIHRoZSB1c2VyIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGRvZXMgbm90IGV4aXN0IChlLmcuIHRoZSBjb250YWluZXIgaGFzCi0JICogbm8gc2NoZW1hIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgdXNlciBuYW1lKS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpCi0JICovCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgImRlZmF1bHQiIHNjaGVtYSBpZGVudGlmaWVyLgotCSAqIFRoZSBjb250YWluZXIgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHNjaGVtYSB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U2NoZW1hKCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2VxdWVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTFmZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIERhdGFiYXNlIHNlcXVlbmNlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlIGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSdzIHNjaGVtYS4KLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1RhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjYyOTIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGUgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3Mgc2NoZW1hLgotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWEoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0Q29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucyB0aGUgdGFibGUgY29udGFpbnMuCi0JICovCi0JaW50IGdldENvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIGNvbHVtbidzIG5hbWUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JQ29sdW1uIGdldENvbHVtbk5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBjb2x1bW4gaWRlbnRpZmVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRDb2x1bW5OYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKQotCSAqLwotCUNvbHVtbiBnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBwcmltYXJ5IGtleSBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uLiBUaHJvdyBhbgotCSAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHRoZSB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSBwcmltYXJ5IGtleSBjb2x1bW4uCi0JICovCi0JQ29sdW1uIGdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBmb3JlaWduIGtleXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGZvcmVpZ24ga2V5cy4KLQkgKi8KLQlJdGVyYWJsZTxGb3JlaWduS2V5PiBnZXRGb3JlaWduS2V5cygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZm9yZWlnbiBrZXlzIHRoZSB0YWJsZSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0Rm9yZWlnbktleXNTaXplKCk7Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBpcyBwb3NzaWJseSBhICJqb2luIiB0YWJsZQotCSAqIChpLmUuIGl0IGNvbnRhaW5zIG9ubHkgMiBmb3JlaWduIGtleXMpLiBXaGV0aGVyIHRoZSB0YWJsZSA8ZW0+YWN0dWFsbHk8L2VtPiBpcwotCSAqIGEgImpvaW4iIHRhYmxlIGlzIGRldGVybWluZWQgYnkgdGhlIHNlbWFudGljcyBvZiB0aGUgZGF0YWJhc2UgZGVzaWduLgotCSAqLwotCWJvb2xlYW4gaXNQb3NzaWJsZUpvaW5UYWJsZSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIHRoZQotCSAqICJvd25pbmciIHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIHRoZQotCSAqICJub24tb3duaW5nIiB0YWJsZS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlGb3JlaWduS2V5IGdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIEFzc3VtaW5nIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSwgcmV0dXJuIHdoZXRoZXIgaXRzIG5hbWUgbWF0Y2hlcwotCSAqIHRoZSBKUEEgZGVmYXVsdCAoaS5lLiA8Y29kZT4iT1dOSU5HVEFCTEVfTk9OT1dOSU5HVEFCTEUiPC9jb2RlPikuCi0JICogQHNlZSAjaXNQb3NzaWJsZUpvaW5UYWJsZSgpCi0JICovCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmQ5MjRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci0KLS8qKgotICogV3JhcCBhIERUUCBDYXRhbG9nCi0gKi8KLWZpbmFsIGNsYXNzIERUUENhdGFsb2dXcmFwcGVyCi0JZXh0ZW5kcyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDYXRhbG9nCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBjYXRhbG9nICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENhdGFsb2dXcmFwcGVyKERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlzdXBlcihkYXRhYmFzZSwgZHRwQ2F0YWxvZyk7Ci0JCXRoaXMuZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2c7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jYXRhbG9nQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nLmdldFNjaGVtYXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFNjaGVtYS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpIDoKLQkJCQkJCXRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGcm9tQ2F0YWxvZ3MoZHRwU2NoZW1hKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGUob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldFRhYmxlXyhkdHBUYWJsZSkgOgotCQkJCQkJdGhpcy5nZXREYXRhYmFzZSgpLmdldFRhYmxlRnJvbUNhdGFsb2dzKGR0cFRhYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cENvbHVtbi5nZXRUYWJsZSgpLmdldFNjaGVtYSgpLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikgOgotCQkJCQkJdGhpcy5nZXREYXRhYmFzZSgpLmdldENvbHVtbkZyb21DYXRhbG9ncyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nID09IGNhdGFsb2c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzQyYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29sdW1uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5kYmRlZmluaXRpb24uUHJlZGVmaW5lZERhdGFUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5FeGFjdE51bWVyaWNEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuTnVtZXJpY2FsRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLlByZWRlZmluZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb2x1bW4KLSAqLwotZmluYWwgY2xhc3MgRFRQQ29sdW1uV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2x1bW4KLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbHVtbiAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW47Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ29sdW1uV3JhcHBlcihEVFBUYWJsZVdyYXBwZXIgdGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXN1cGVyKHRhYmxlLCBkdHBDb2x1bW4pOwotCQl0aGlzLmR0cENvbHVtbiA9IGR0cENvbHVtbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbHVtbkNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIChEVFBUYWJsZVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnModGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5pc051bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhVHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKSBpbnN0YW5jZW9mIE51bWVyaWNhbERhdGFUeXBlOwotCX0JCi0KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgTnVtZXJpY2FsRGF0YVR5cGUpID8KLQkJCQkJCSgoTnVtZXJpY2FsRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmVjaXNpb24oKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjYWxlKCl7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIEV4YWN0TnVtZXJpY0RhdGFUeXBlKSA/Ci0JCQkJCQkoKEV4YWN0TnVtZXJpY0RhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0U2NhbGUoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpID8KLQkJCQkJCSgoQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRMZW5ndGgoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xPQigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQkJCQlwcmltaXRpdmVUeXBlSXNMb2IoKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkpIDoKLQkJCQkJCWZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQljb252ZXJ0VG9KUEFKYXZhVHlwZSh0aGlzLmdldEphdmFUeXBlKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKSkgOgotCQkJREVGQVVMVF9KQVZBX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkgewotCQlyZXR1cm4gY29udmVydFRvSlBBUHJpbWFyeUtleUphdmFUeXBlKHRoaXMuZ2V0SmF2YVR5cGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhVHlwZSBnZXRKYXZhVHlwZShQcmVkZWZpbmVkRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJLy8gdGhpcyBpcyBqdXN0IGEgYml0IGhhY2t5OiBtb3ZpbmcgZnJvbSBhIHR5cGUgZGVjbGFyYXRpb24gdG8gYSBjbGFzcyBuYW1lIHRvIGEgdHlwZSBkZWNsYXJhdGlvbi4uLgotCQlTdHJpbmcgZHRwSmF2YUNsYXNzTmFtZSA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24oZGF0YVR5cGUpLmdldEphdmFDbGFzc05hbWUoKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVKYXZhVHlwZShSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKGR0cEphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24gcmVzb2x2ZURlZmluaXRpb24oUHJlZGVmaW5lZERhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RFRQRGVmaW5pdGlvbigpLmdldFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24oZGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbiA9PSBjb2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpEQkMgc3BlYyBzYXlzIEpEQkMgZHJpdmVycyBzaG91bGQgYmUgYWJsZSB0byBtYXAgQkxPQnMgYW5kIENMT0JzCi0JICogZGlyZWN0bHksIGJ1dCB0aGUgSlBBIHNwZWMgZG9lcyBub3QgYWxsb3cgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZSBjb252ZXJ0VG9KUEFKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIEJZVEVfQVJSQVlfSkFWQV9UWVBFOwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQ0xPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQkJfQotCQlyZXR1cm4gamF2YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIEpQQSBzcGVjIFsyLjEuNF0gc2F5cyBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGFsbG93ZWQgaW4KLQkgKiBwcmltYXJ5IGtleSBmaWVsZHM6PHVsPgotCSAqICAgICA8bGk+W3ZhcmlhYmxlXSBwcmltaXRpdmVzCi0JICogICAgIDxsaT5bdmFyaWFibGVdIHByaW1pdGl2ZSB3cmFwcGVycwotCSAqICAgICA8bGk+e0BsaW5rIGphdmEubGFuZy5TdHJpbmd9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS51dGlsLkRhdGV9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS5zcWwuRGF0ZX0KLQkgKiA8L3VsPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlIGNvbnZlcnRUb0pQQVByaW1hcnlLZXlKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZSgpCi0JCQkJfHwgamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTVFJJTkdfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhVVElMX0RBVEVfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTUUxfREFURV9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gamF2YVR5cGU7Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhCSUdfREVDSU1BTF9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gTE9OR19KQVZBX1RZUEU7ICAvLyA/PwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoU1FMX1RJTUVfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQkvLyBhbGwgdGhlIG90aGVyIHR5cGljYWwgdHlwZXMgYXJlIHByZXR0eSBtdWNoIHVuLW1hcHBhYmxlIC0gcmV0dXJuIFN0cmluZyg/KQotCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1pdGl2ZVR5cGVJc0xvYihQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUpIHsKLQkJcmV0dXJuIChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQklOQVJZX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKTsKLQl9Ci0KLQotCS8vICoqKioqIHNvbWUgY29uc3RhbnRzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRoZSBjb2x1bW4gdG8gYSBKYXZhIGF0dHJpYnV0ZQotCS8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIERFRkFVTFRfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQkxPQl9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuQmxvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQllURV9BUlJBWV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoYnl0ZVtdLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIENMT0JfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLkNsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNUUklOR19KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBVVElMX0RBVEVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5EYXRlLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfREFURV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuRGF0ZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX1RJTUVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCSUdfREVDSU1BTF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIExPTkdfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGxvbmcuY2xhc3MpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQzYmQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIHRoZSBEVFAgUHJvZmlsZU1hbmFnZXIgaW4geWV0IGFub3RoZXIgc2luZ2xldG9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5Ci0JaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkKLXsKLQlwcml2YXRlIFByb2ZpbGVNYW5hZ2VyIGR0cFByb2ZpbGVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBMb2NhbFByb2ZpbGVMaXN0ZW5lciBwcm9maWxlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogJ3ByaXZhdGUnIHRvIGVuc3VyZSBzaW5nbGV0b24KLQkgKi8KLQlwcml2YXRlIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlmZWN5Y2xlICoqKioqKioqKioKLQotCS8qKgotCSAqIGNhbGxlZCBieSBwbHVnLWluCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIgPSBuZXcgTG9jYWxQcm9maWxlTGlzdGVuZXIoKTsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5hZGRQcm9maWxlTGlzdGVuZXIodGhpcy5wcm9maWxlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIGNhbGxlZCBieSBwbHVnLWluCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKHRoaXMucHJvZmlsZUxpc3RlbmVyKTsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIgPSBudWxsOwotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBwcm9maWxlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgYWRhcHRlcikgewotCQlmb3IgKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlIDogdGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpKSB7Ci0JCQlpZiAoZHRwUHJvZmlsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIoZHRwUHJvZmlsZSwgYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZSwgU3RyaW5nPih0aGlzLmdldERUUENvbm5lY3Rpb25Qcm9maWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQkJIHJldHVybiBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJdGVyYWJsZTxJQ29ubmVjdGlvblByb2ZpbGU+IGdldERUUENvbm5lY3Rpb25Qcm9maWxlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZT4odGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnRzIHRvIHRoZSBmYWN0b3J5J3MgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lcjEgewotCQlwcml2YXRlIExpc3RlbmVyTGlzdDxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+KENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuY2xhc3MpOwotCi0JCUxvY2FsUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIElQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkJU3RyaW5nIG5hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCWZvciAoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY29ubmVjdGlvblByb2ZpbGVBZGRlZChuYW1lKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlLCBTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG9sZERlc2NyaXB0aW9uLCBCb29sZWFuIG9sZEF1dG9Db25uZWN0KSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJaWYgKCAhIG5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQkJbGlzdGVuZXIuY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKG9sZE5hbWUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQkvLyB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG9uIElQcm9maWxlTGlzdGVuZXIxCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVEZWxldGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNjE1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Ecml2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUuRGF0YWJhc2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5jb3JlLnByb2ZpbGUuUHJvZmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbm5lY3Rpb25Qcm9maWxlCi0gKi8KLWZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcgotCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QsIENvbm5lY3Rpb25Qcm9maWxlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgKi8KLQlwcml2YXRlIGZpbmFsIElDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZTsKLQotCS8qKiBhZGFwdGVyIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgKGRldGVybWluZXMgaWRlbnRpZmllciBkZWxpbWl0ZXJzLCBldGMuKSAqLwotCXByaXZhdGUgZmluYWwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBpZGVudGlmaWVyQWRhcHRlcjsKLQotCS8qKiBjYWxsYmFjayBwYXNzZWQgdG8gdGhlIGlkZW50aWZpZXIgYWRhcHRlciAqLwotCXByaXZhdGUgZmluYWwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Q2FsbGJhY2sgaWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjazsKLQotCS8qKiB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiB3ZSBsaXN0ZW4gdG8gKi8KLQlwcml2YXRlIGZpbmFsIElNYW5hZ2VkQ29ubmVjdGlvbiBkdHBNYW5hZ2VkQ29ubmVjdGlvbjsKLQotCS8qKgotCSAqIGZvcndhcmQgZXZlbnRzIGZyb20gdGhlIERUUCBtYW5hZ2VkIGNvbm5lY3Rpb24gYWJvdmU7Ci0JICogd2UgbGlzdGVuIGFuZCBwcm9wYWdhdGUgZXZlbnRzIGlmZiB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBhbmQgZGVsZXRlZCBhdCBkaXNjb25uZWN0ICovCi0JcHJpdmF0ZSBEVFBEYXRhYmFzZVdyYXBwZXIgZGF0YWJhc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVZFX0RUUF9DT05ORUNUSU9OX1RZUEUgPSAiamF2YS5zcWwuQ29ubmVjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZGTElORV9EVFBfQ09OTkVDVElPTl9UWVBFID0gQ29ubmVjdGlvbkluZm8uY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX1BST0RVQ1RfUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNlcnZlci52ZXJzaW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZSA9IGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCQl0aGlzLmlkZW50aWZpZXJBZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5pZGVudGlmaWVyQWRhcHRlckNhbGxiYWNrID0gbmV3IElkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2soKTsKLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbiA9IHRoaXMuYnVpbGREVFBNYW5hZ2VkQ29ubmVjdGlvbigpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IG5ldyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkvLyBkb24ndCBsaXN0ZW4gdG8gdGhlIG1hbmFnZWQgY29ubmVjdGlvbiB5ZXQKLQl9Ci0KLQlwcml2YXRlIElNYW5hZ2VkQ29ubmVjdGlvbiBidWlsZERUUE1hbmFnZWRDb25uZWN0aW9uKCkgewotCQlTdHJpbmcgY29ubmVjdGlvblR5cGUgPSB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkgPwotCQkJCU9GRkxJTkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA6IExJVkVfRFRQX0NPTk5FQ1RJT05fVFlQRTsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0TWFuYWdlZENvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoU3RyaW5nIGphdmFJZGVudGlmaWVyKSB7Ci0JCS8vIGNvbm5lY3Rpb24gcHJvZmlsZXMgZG8gbm90IGhhdmUgImlkZW50aWZpZXJzIgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCS8vIGNvbm5lY3Rpb24gcHJvZmlsZXMgZG8gbm90IGhhdmUgImlkZW50aWZpZXJzIgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBEYXRhYmFzZVdyYXBwZXIgZ2V0RGF0YWJhc2UoKSB7Ci0JCWlmICh0aGlzLmRhdGFiYXNlID09IG51bGwpIHsKLQkJCXRoaXMuZGF0YWJhc2UgPSB0aGlzLmJ1aWxkRGF0YWJhc2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29ubmVjdGlvblByb2ZpbGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogcHJvcGVydGllcwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0UHJvdmlkZXJJZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0SW5zdGFuY2VJRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfTkFNRV9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREFUQUJBU0VfUFJPRFVDVF9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIG5hbWUuCi0JICogQWxsb3dzIHVzZXIgbmFtZSBjb21wb3NlZCBieSBtb3JlIHRoYW4gb25lIHdvcmQuCi0JICogSWYgdGhlIHVzZXIgbmFtZSBjb250YWlucyBhIGtleXdvcmQsIGl0IHJldHVybnMgdGhlIGZpcnN0IHdvcmQgb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewotCQlTdHJpbmcgdXNlck5hbWUgPSB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lEKTsKLQkJdXNlck5hbWUgPSB1c2VyTmFtZS50cmltKCk7IAotCQlTdHJpbmdbXSBuYW1lcyA9ICB1c2VyTmFtZS5zcGxpdCgiXFxzKyIpOwkvLyROT04tTkxTLTEkCi0JCWlmKG5hbWVzLmxlbmd0aCA9PSAzKSB7IC8vIDIwODk0NiBoYW5kbGUgdXNlcm5hbWUgbGlrZSAic3lzIGFzIHN5c2RiYSIgb24gT3JhY2xlCi0JCSAgICBpZih0aGlzLm5hbWVJc0tleXdvcmQobmFtZXNbMV0pKSB7Ci0JCSAgICAJcmV0dXJuIG5hbWVzWzBdOwotCQkgICAgfQotCQl9Ci0JCXJldHVybiB1c2VyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiBEcml2ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RHJpdmVySW5zdGFuY2VCeUlEKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpLmdldEphckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiBEcml2ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RHJpdmVySW5zdGFuY2VCeUlEKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpLmdldE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBjb25uZWN0aW9uCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkgfHwgdGhpcy5pc1dvcmtpbmdPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0FjdGl2ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpCi0JCQkJJiYgISB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCWlmICh0aGlzLmlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCXRoaXMuY2hlY2tTdGF0dXModGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCXRoaXMuY2hlY2tTdGF0dXModGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCkpOwotCX0KLQotCS8vICoqKioqIG9mZi1saW5lIHN1cHBvcnQKLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5pc1dvcmtpbmdPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgc2F2ZVdvcmtPZmZsaW5lRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5Xb3JrT2ZmbGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB3b3JrT2ZmbGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUud29ya09mZmxpbmUoKTsKLQl9Ci0JCi0JLy8gKioqKiogbGlzdGVuZXJzCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgeyAgLy8gZmlyc3QgbGlzdGVuZXIgYWRkZWQKLQkJCXRoaXMuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7ICAvLyBkb24ndCB0cmlnZ2VyIGRhdGFiYXNlIGNyZWF0aW9uCi0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7ICAvLyBsYXN0IGxpc3RlbmVyIHJlbW92ZWQKLQkJCXRoaXMuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLmRhdGFiYXNlICE9IG51bGwpIHsgIC8vIGRvbid0IHRyaWdnZXIgZGF0YWJhc2UgY3JlYXRpb24KLQkJCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsgIC8vIERUUCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBvZmYtbGluZQotCQkJCXRoaXMuZGF0YWJhc2Uuc3RvcExpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JCXRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24ucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuaGFzTm9MaXN0ZW5lcnMoKTsKLQl9Ci0KLQlib29sZWFuIGhhc0FueUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmhhc0FueUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBjaGVja1N0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlmb3IgKElTdGF0dXMgY2hpbGQgOiBzdGF0dXMuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCXRoaXMuY2hlY2tTdGF0dXMoY2hpbGQpOyAgLy8gcmVjdXJzZSwgbG9va2luZyBmb3IgdGhlIGZpcnN0IGVycm9yCi0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIERUUERhdGFiYXNlV3JhcHBlciBidWlsZERhdGFiYXNlKCkgewotCQlpZiAodGhpcy5pc0luYWN0aXZlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHRoaXMuaXNXb3JraW5nT2ZmbGluZSgpKSB7Ci0JCQlDb25uZWN0aW9uSW5mbyBjb25uZWN0aW9uSW5mbyA9IChDb25uZWN0aW9uSW5mbykgdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5nZXRDb25uZWN0aW9uKCkuZ2V0UmF3Q29ubmVjdGlvbigpOwotCQkJcmV0dXJuIG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIodGhpcywgY29ubmVjdGlvbkluZm8uZ2V0U2hhcmVkRGF0YWJhc2UoKSk7Ci0JCX0KLQotCQkvLyBUT0RPIHNlZSBEVFAgYnVnIDIwMjMwNgotCQkvLyBwYXNzIGNvbm5lY3Q9dHJ1ZSBpbiB0byBQcm9maWxlVXRpbC5nZXREYXRhYmFzZSgpCi0JCS8vIHRoZXJlIGlzIGEgYnVnIG1lbnRpb25lZCBpbiBhIGNvbW1lbnQ6IAotCQkvLyAgICAgImR1cmluZyB0aGUgcHJvZmlsZSBjb25uZWN0ZWQgZXZlbnQgbm90aWZpY2F0aW9uLCAKLQkJLy8gICAgIElNYW5hZ2VkQ29ubmVjdGlvbiBpcyBjb25uZWN0ZWQgd2hpbGUgSUNvbm5lY3Rpb25Qcm9maWxlIGlzIG5vdCIKLQkJLy8gc28sIHNvbWUgaGFja2VyeSBoZXJlIHRvIGhhbmRsZSBoYWNrZXJ5IHRoZXJlCi0JCXJldHVybiBuZXcgRFRQRGF0YWJhc2VXcmFwcGVyKHRoaXMsIFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKG5ldyBEYXRhYmFzZUlkZW50aWZpZXIodGhpcy5nZXROYW1lKCksIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpLCB0cnVlKSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXJEYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCQl0aGlzLmRhdGFiYXNlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHdlIG5lZWQgdG8gY29udmVydCBhbiBpZGVudGlmaWVyIHRvIGEgbmFtZQotCSAqIChlLmcuIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpfSkuCi0JICogV2UgY2hhbm5lbCBhbGwgdGhlIGNhbGxzIHRvIGhlcmUgYW5kIHRoZW4gd2UgZGVsZWdhdGUgdG8gdGhlCi0JICogY2xpZW50LXN1cHBsaWVkICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiLgotCSAqLwotCVN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5pZGVudGlmaWVyQWRhcHRlci5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyLCB0aGlzLmlkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2spOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0ICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiIGNhbGxzIGJhY2sgdG8gaGVyZSBzbyB3ZSBjYW4gZGVsZWdhdGUgdG8KLQkgKiB0aGUgZGF0YWJhc2UsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb3Blcmx5Ci0JICogY29udmVydCBpZGVudGlmaWVycy4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWVfKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCS8vIHRoZSBkYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwgaGVyZSAtIGNhbGwgaXRzIGludGVybmFsIG1ldGhvZAotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb252ZXJ0SWRlbnRpZmllclRvTmFtZV8oaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBjb252ZXJ0IGEgbmFtZSB0byBhbiBpZGVudGlmaWVyCi0JICogKGUuZy4ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZyl9KS4KLQkgKiBXZSBjaGFubmVsIGFsbCB0aGUgY2FsbHMgdG8gaGVyZSBhbmQgdGhlbiB3ZSBkZWxlZ2F0ZSB0byB0aGUKLQkgKiBjbGllbnQtc3VwcGxpZWQgImRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlkZW50aWZpZXJBZGFwdGVyLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUsIHRoaXMuaWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjayk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgImRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciIgY2FsbHMgYmFjayB0byBoZXJlIHNvIHdlIGNhbiBkZWxlZ2F0ZSB0bwotCSAqIHRoZSBkYXRhYmFzZSwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcHJvcGVybHkKLQkgKiBjb252ZXJ0IG5hbWVzLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcl8oU3RyaW5nIG5hbWUpIHsKLQkJLy8gdGhlIGRhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCBoZXJlIC0gY2FsbCBpdHMgaW50ZXJuYWwgbWV0aG9kCi0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyXyhuYW1lKTsKLQl9Ci0KLQl2b2lkIGRhdGFiYXNlQ2hhbmdlZChEVFBEYXRhYmFzZVdyYXBwZXIgZGIpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuZGF0YWJhc2VDaGFuZ2VkKGRiKTsKLQl9Ci0KLQl2b2lkIGNhdGFsb2dDaGFuZ2VkKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoY2F0YWxvZyk7Ci0JfQotCi0Jdm9pZCBzY2hlbWFDaGFuZ2VkKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQl9Ci0KLQl2b2lkIHNlcXVlbmNlQ2hhbmdlZChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuc2VxdWVuY2VDaGFuZ2VkKHNlcXVlbmNlKTsKLQl9Ci0KLQl2b2lkIHRhYmxlQ2hhbmdlZChEVFBUYWJsZVdyYXBwZXIgdGFibGUpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQl9Ci0KLQl2b2lkIGNvbHVtbkNoYW5nZWQoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4pIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuY29sdW1uQ2hhbmdlZChjb2x1bW4pOwotCX0KLQotCXZvaWQgZm9yZWlnbktleUNoYW5nZWQoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5mb3JlaWduS2V5Q2hhbmdlZChmb3JlaWduS2V5KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEJhc2VQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmFtZUlzS2V5d29yZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhcyIpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgY29ubmVjdGlvbiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHRyYW5zbGF0ZXMgYW5kIGZvcndhcmRzIHtAbGluayBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyfSBhbmQKLQkgKiB7QGxpbmsgSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyfSBldmVudHMgdG8ge0BsaW5rIENvbm5lY3Rpb25MaXN0ZW5lcn1zLgotCSAqLwotCWNsYXNzIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4oQ29ubmVjdGlvbkxpc3RlbmVyLmNsYXNzKTsKLQotCQlMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQl2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQkJcmV0dXJuICEgdGhpcy5saXN0ZW5lckxpc3QuaXNFbXB0eSgpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIElNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBvZmYtbGluZSBvciBpbmFjdGl2ZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdCBidWlsZCB0aGUgZGF0YWJhc2UgaGVyZSAtIGl0IGlzIGJ1aWx0IG9uLWRlbWFuZAotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5vcGVuZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBmcm9tIHRoZSBiYXNlIERUUCBjb2RlLgotCQkgKiBQZXJoYXBzIERUUCBleHRlbmRlcnMgY2FsbCBpdC4uLi4KLQkJICogQHNlZSBNYW5hZ2VkQ29ubmVjdGlvbiNmaXJlTW9kaWZpZWRFdmVudChPYmplY3QpCi0JCSAqICAgICB3aGljaCBpcyBuZXZlciBjYWxsZWQuLi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5tb2RpZmllZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWlmICggISBsaXN0ZW5lci5va1RvQ2xvc2UoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuYWJvdXRUb0Nsb3NlKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGxpdmUgb3Igb2ZmLWxpbmUgPT4gaW5hY3RpdmUKLQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY2xlYXIgdGhlIGRhdGFiYXNlCi0JCQlEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcy5jbGVhckRhdGFiYXNlKCk7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNsb3NlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyBib29sZWFuIG9rVG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAib2sgdG8gY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQlyZXR1cm4gdGhpcy5va1RvQ2xvc2UoZXZlbnQpOwotCQl9Ci0JCQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhICJjbG9zZSIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgImNsb3NpbmciIHRoZSBsaXZlIGNvbm5lY3Rpb24KLQkJCXRoaXMuY2xvc2VkKGV2ZW50KTsKLQkJfQotCi0JCS8vIGluYWN0aXZlIG9yIGxpdmUgPT4gb2ZmLWxpbmUKLQkJcHVibGljIHZvaWQgd29ya2luZ09mZmxpbmUoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAib3BlbiIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgIm9wZW5pbmciIHRoZSBvZmYtbGluZSBjb25uZWN0aW9uCi0JCQl0aGlzLm9wZW5lZChldmVudCk7Ci0JCX0KLQotCQkvLyBvZmYtbGluZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9BdHRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAiY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgb2ZmLWxpbmUgY29ubmVjdGlvbgotCQkJdGhpcy5jbG9zZWQoZXZlbnQpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKERUUERhdGFiYXNlV3JhcHBlciBkYikgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgZGIpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGNhdGFsb2cpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBzY2hlbWFDaGFuZ2VkKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuc2NoZW1hQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2NoZW1hKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgc2VxdWVuY2VDaGFuZ2VkKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2VxdWVuY2UpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIudGFibGVDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCB0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGNvbHVtbkNoYW5nZWQoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4pIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb2x1bW5DaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBjb2x1bW4pOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5KSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGZvcmVpZ25LZXkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBEYXRhYmFzZUZpbmRlciAqKioqKioqKioqCi0KLQljbGFzcyBJZGVudGlmaWVyQWRhcHRlckNhbGxiYWNrIGltcGxlbWVudHMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Q2FsbGJhY2sgewotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCQkvLyBjYWxsIGJhY2sgdG8gdGhlIGludGVybmFsIG1ldGhvZAotCQkJcmV0dXJuIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lXyhpZGVudGlmaWVyKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCQkvLyBjYWxsIGJhY2sgdG8gdGhlIGludGVybmFsIG1ldGhvZAotCQkJcmV0dXJuIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyXyhuYW1lKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzZmZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OwotCi0vKioKLSAqIERUUCBkYXRhYmFzZSBvYmplY3QKLSAqLwotcHVibGljIGludGVyZmFjZSBEVFBEYXRhYmFzZU9iamVjdCBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MzY2I3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5SZWZyZXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogIERUUCBDYXRhbG9nIE9iamVjdCBXcmFwcGVyIGJhc2UgY2xhc3MKLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBEVFBEYXRhYmFzZU9iamVjdAotewotCS8qKiB3ZSBuZWVkIGEgd2F5IHRvIGdldCB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlICovCi0JcHJpdmF0ZSBmaW5hbCBEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQ7Ci0KLQkvKiogbGlzdGVuIGZvciB0aGUgImNhdGFsb2cgb2JqZWN0IiBiZWluZyByZWZyZXNoZWQgKi8KLQlwcml2YXRlIGZpbmFsIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ09iamVjdExpc3RlbmVyOwotCi0JLyoqIGxpc3RlbiBmb3IgdGhpcyBEVFAgY2F0YWxvZyBvYmplY3QgdG8gcmVmcmVzaCAqLwotCWZpbmFsIElDYXRhbG9nT2JqZWN0IGNhdGFsb2dPYmplY3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCURUUERhdGFiYXNlT2JqZWN0V3JhcHBlcihEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQsIE9iamVjdCBkdHBPYmplY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gd2Ugb25seSBsaXN0ZW4gdG8gImxpdmUiIGNvbm5lY3Rpb25zIChhcyBvcHBvc2VkIHRvICJvZmYtbGluZSIgY29ubmVjdGlvbnMpOwotCQkJLy8gYW5kIHRoZSBtb2RlbCBpcyByZWJ1aWx0IHdoZW4gdGhlIGNvbm5lY3Rpb24gY29ubmVjdHMgb3IgZGlzY29ubmVjdHMKLQkJCXRoaXMuY2F0YWxvZ09iamVjdCA9IChJQ2F0YWxvZ09iamVjdCkgZHRwT2JqZWN0OwotCQkJdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCk7Ci0JCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmhhc0FueUxpc3RlbmVycygpKSB7Ci0JCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5jYXRhbG9nT2JqZWN0ID0gbnVsbDsKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJQ2F0YWxvZ09iamVjdCBkbUVsZW1lbnQsIGludCBldmVudFR5cGUpIHsKLQkJCQlpZiAoZG1FbGVtZW50ID09IERUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3QpIHsKLQkJCQkJLy8gJ2V2ZW50VHlwZScgZG9lc24ndCBzZWVtIHRvIGJlIHZlcnkgdXNlZnVsLCBzbyBkcm9wIGl0Ci0JCQkJCURUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIHR5cGljYWxseSwgbm90aWZ5IHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc29tZXRoaW5nIGhhcyBjaGFuZ2VkCi0Jdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBEVFAgb2JqZWN0IGhhcyBjaGFuZ2VkLCBjbGVhciB0aGUgd3JhcHBlcidzIHN0YXRlIHNvIGl0IHdpbGwgYmUKLQkgKiBzeW5jaHJvbml6ZWQgb24tZGVtYW5kLgotCSAqLwotCWFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBJZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzICJkZWxpbWl0ZWQiICh0eXBpY2FsbHkgd2l0aCBkb3VibGUtcXVvdGVzKSwgaXQgd2lsbCBiZQotCSAqIHVzZWQgd2l0aG91dCBhbnkgZm9sZGluZy4gSWYgdGhlIG5hbWUgaXMgInJlZ3VsYXIiIChpLmUuIG5vdCBkZWxpbWl0ZWQpLAotCSAqIGl0IHdpbGwgYmUgZm9sZGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlICh0eXBpY2FsbHkgdXBwZXJjYXNlKS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB3aGVuZXZlciB3ZSBuZWVkIHRvIGZpbmQgYSBjb21wb25lbnQgYnkgaWRlbnRpZmllcgotCSAqIChlLmcuIHt7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlI2dldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nKX0pLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChkYXRhYmFzZU9iamVjdHMsIHRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcikpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoVCBkYk9iamVjdCA6IGRhdGFiYXNlT2JqZWN0cykgewotCQkJaWYgKGRiT2JqZWN0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZGJPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRXhhbXBsZXM6PHVsPgotCSAqIDxsaT5PcmFjbGUgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgPGxpPlRhYmxlKEJBUikgdnMuICJGb28iID0+ICJCQVIiCi0JICogICAgIDxsaT5UYWJsZShGb28pIHZzLiAiRm9vIiA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5Qb3N0Z3JlU1FMIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShmb28pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5UYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiXCJCYXJcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+VGFibGUoZm9vKSB2cy4gIkZvbyIgPT4gImZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGJhcikgdnMuICJGb28iID0+ICJiYXIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiQmFyIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpLCBkZWZhdWx0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRXhhbXBsZXM6PHVsPgotCSAqIDxsaT5PcmFjbGUgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgPT4gIkZPTyIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28pID0+ICJcImZvb1wiIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCi0JICogICAgIDxsaT5UYWJsZShmIm8pID0+ICJcImZcIlwib1wiIiAoaS5lLiAiZiIibyIpCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlBvc3RncmVTUUwgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgPT4gIlwiRk9PXCIiCi0JICogICAgIDxsaT5UYWJsZShGb28pID0+ICJcIkZvb1wiIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCi0JICogICAgIDxsaT5UYWJsZShmIm8pID0+ICJcImZcIlwib1wiIiAoaS5lLiAiZiIibyIpCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlNRTCBTZXJ2ZXIgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgPT4gIkZPTyIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgPT4gIkZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgPT4gImZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbysrKSA9PiAiXCJmb28rK1wiIgotCSAqICAgICA8bGk+VGFibGUoZiJvKSA9PiAiXCJmXCJcIm9cIiIgKGkuZS4gImYiIm8iKQotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgdG8gRFRQIGRhdGFiYXNlIG9iamVjdCAqKioqKioqKioqCi0KLQkvLyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgImxpdmUiIGFuZCBoYXMgbGlzdGVuZXJzCi0Jdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJdGhpcy5jaGVja0xpc3RlbmVyKCk7Ci0JCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkuQWRkTGlzdGVuZXIodGhpcy5jYXRhbG9nT2JqZWN0LCB0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JfQotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIG5vIGxpc3RlbmVycwotCXZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJdGhpcy5jaGVja0xpc3RlbmVyKCk7Ci0gICAgICAgIFJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIodGhpcy5jYXRhbG9nT2JqZWN0LCB0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTGlzdGVuZXIoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgY2F0YWxvZyBsaXN0ZW5lciBpcyBudWxsIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjE4NTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmRlZmluaXRpb24uRGF0YWJhc2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmludGVybmFsLmNvcmUuUkRCQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3IuVmVuZG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3IuVmVuZG9yUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIGEgRFRQIERhdGFiYXNlLgotICogPHA+Ci0gKiBDYXRhbG9ncyB2cy4gU2NoZW1hdGE6PGJyPgotICogVHlwaWNhbGx5LCBpZiBhIERUUCBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0ICJjYXRhbG9ncyIsCi0gKiBvLmUuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlI2dldENhdGFsb2dzKCkgd2lsbCByZXR1cm4gYQotICogc2luZ2xlIGNhdGFsb2cgd2l0aG91dCBhIG5hbWUgKGFjdHVhbGx5LCBpdCdzIGFuIGVtcHR5IHN0cmluZykuIFRoaXMgY2F0YWxvZwotICogd2lsbCBjb250YWluIGFsbCB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YS4gV2UgdHJ5IHRvIGlnbm9yZSB0aGlzIGNhdGFsb2cgYW5kCi0gKiByZXR1cm4gdGhlIHNjaGVtYXRhIGZyb20gdGhlIGRhdGFiYXNlIGRpcmVjdGx5LgotICogPHA+Ci0gKiBDYXRhbG9nIE5vdGUgMTo8YnI+Ci0gKiBBcyBvZiBKYW4gMjAwOSwgdGhlIERUUCBNeVNRTCBkcml2ZXIgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGlzIHBhdHRlcm4uCi0gKiBBIERUUCBNeVNRTCBkYXRhYmFzZSBoYXMgKm5vKiBjYXRhbG9nczsgaXQgaG9sZHMgYSBzaW5nbGUgc2NoZW1hCi0gKiBkaXJlY3RseSwgYW5kIHRoYXQgc2NoZW1hIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkYXRhYmFzZS4gU2VlIGJ1ZyAyNDkwMTMuCi0gKiA8cD4KLSAqIENhdGFsb2cgTm90ZSAyOjxicj4KLSAqIEFzIG9mIEphbiAyMDA5LCB0aGUgUG9zdGdyZVNRTCBKREJDIGRyaXZlciBjb21wbGljYXRlcyB0aGlzIHBhdHRlcm4gYSBiaXQuCi0gKiBFdmVuIHRob3VnaCBQb3N0Z3JlU1FMIGRvZXMgbm90IHN1cHBvcnQgImNhdGFsb2dzIiwgaXRzIEpEQkMgZHJpdmVyCi0gKiByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkCi0gKiBpbiB0aGUgSkRCQyBjb25uZWN0aW9uIFVSTC4gVGhlIERUUCBQb3N0Z3JlU1FMIGRyaXZlciBzaW1wbHkgcmVwbGljYXRlcyB0aGlzCi0gKiBiZWhhdmlvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYXRhbG9nIGNhbiBiZSB1bm5hbWVkOyBpLmUuIGl0cyBuYW1lIGlzIGFuCi0gKiBlbXB0eSBzdHJpbmcuLi4uCi0gKiA8cD4KLSAqIChZZXQgQW5vdGhlcikgTm90ZTo8YnI+Ci0gKiBXZSB1c2UgIm5hbWUiIHdoZW4gZGVhbGluZyB3aXRoIHRoZSB1bm1vZGlmaWVkIG5hbWUgb2YgYSBkYXRhYmFzZSBvYmplY3QKLSAqIGFzIHN1cHBsaWVkIGJ5IHRoZSBkYXRhYmFzZSBpdHNlbGYgKGkuZS4gaXQgaXMgbm90IGRlbGltaXRlZCBhbmQgaXQgaXMgYWx3YXlzCi0gKiBjYXNlLXNlbnNpdGl2ZSkuCi0gKiBXZSB1c2UgImlkZW50aWZpZXIiIHdoZW4gZGVhbGluZyB3aXRoIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0YWJhc2UKLSAqIG9iamVjdCBuYW1lIChpLmUuIGl0IG1heSBiZSBkZWxpbWl0ZWQgYW5kLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciwgaXQgbWF5Ci0gKiBiZSBjYXNlLWluc2Vuc2l0aXZlKS4KLSAqLwotZmluYWwgY2xhc3MgRFRQRGF0YWJhc2VXcmFwcGVyCi0JZXh0ZW5kcyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBEYXRhYmFzZQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgZGF0YWJhc2UgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZTsKLQotCS8qKiB2ZW5kb3Itc3BlY2lmaWMgYmVoYXZpb3IgKi8KLQlwcml2YXRlIGZpbmFsIFZlbmRvciB2ZW5kb3I7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCwgc29ydGVkICovCi0JcHJpdmF0ZSBEVFBDYXRhbG9nV3JhcHBlcltdIGNhdGFsb2dzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUERhdGFiYXNlV3JhcHBlcihEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgY29ubmVjdGlvblByb2ZpbGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZSkgewotCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZSwgZHRwRGF0YWJhc2UpOwotCQl0aGlzLmR0cERhdGFiYXNlID0gZHRwRGF0YWJhc2U7Ci0JCXRoaXMudmVuZG9yID0gVmVuZG9yUmVwb3NpdG9yeS5pbnN0YW5jZSgpLmdldFZlbmRvcih0aGlzLmdldFZlbmRvck5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyogVE9ETwotCSAqIFdlIG1pZ2h0IHdhbnQgdG8gbGlzdGVuIHRvIHRoZSAidmlydHVhbCIgY2F0YWxvZzsgYnV0IHRoYXQncyBwcm9iYWJseQotCSAqIG5vdCBuZWNlc3Nhcnkgc2luY2UgdGhlcmUgaXMgbm8gZWFzeSB3YXkgZm9yIHRoZSB1c2VyIHRvIHJlZnJlc2ggaXQKLQkgKiAoaS5lLiBpdCBpcyBub3QgZGlzcGxheWVkIGluIHRoZSBEVFAgVUkpLgotCSAqLwotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZGF0YWJhc2VDaGFuZ2VkKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBEVFBEYXRhYmFzZVdyYXBwZXIgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5nZXRTY2hlbWFzKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKTsKLQl9Ci0KLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYUZyb21DYXRhbG9ncyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nKGR0cFNjaGVtYS5nZXRDYXRhbG9nKCkpLmdldFNjaGVtYV8oZHRwU2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBzY2hlbWEgd2hlbiB0aGUgZGF0YWJhc2UgaXMgdGhlIHNjaGVtYQotCSAqIGNvbnRhaW5lciwgc28gd2Uga25vdyB3ZSBkb24ndCBoYXZlIGFueSBjYXRhbG9ncwotCSAqLwotCUBPdmVycmlkZQotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBjYXRhbG9nLCBzbyB3ZSBrbm93IHdlIGhhdmUgY2F0YWxvZ3M7Ci0JICogaS5lLiB0aGUgc2VhcmNoIGhhcyB0byBkZXNjZW5kIHRocm91Z2ggY2F0YWxvZ3MsIHRoZW4gdG8gc2NoZW1hdGEKLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVGcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKS5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSB3aGVuIHRoZSBkYXRhYmFzZSBpcyB0aGUgc2NoZW1hCi0JICogY29udGFpbmVyLCBzbyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IGNhdGFsb2dzCi0JICovCi0JQE92ZXJyaWRlCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIGNhdGFsb2csIHNvIHdlIGtub3cgd2UgaGF2ZSBjYXRhbG9nczsKLQkgKiBpLmUuIHRoZSBzZWFyY2ggaGFzIHRvIGRlc2NlbmQgdGhyb3VnaCBjYXRhbG9ncywgdGhlbiB0byBzY2hlbWF0YQotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uRnJvbUNhdGFsb2dzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKS5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEYXRhYmFzZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldFZlbmRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVyc2lvbigpOwotCX0KLQotCS8vIG92ZXJyaWRlIHRvIG1ha2UgbWV0aG9kIHB1YmxpYyBzaW5jZSBpdCdzIGluIHRoZSBEYXRhYmFzZSBpbnRlcmZhY2UKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gc3VwZXIuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKGRhdGFiYXNlT2JqZWN0cywgaWRlbnRpZmllcik7Ci0JfQotCi0JLy8gKioqKiogY2F0YWxvZ3MKLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5zdXBwb3J0c0NhdGFsb2dzKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxDYXRhbG9nPiBnZXRDYXRhbG9ncygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENhdGFsb2c+KHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQQ2F0YWxvZ1dyYXBwZXI+IGdldENhdGFsb2dXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUENhdGFsb2dXcmFwcGVyPih0aGlzLmdldENhdGFsb2dBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDYXRhbG9nV3JhcHBlcltdIGdldENhdGFsb2dBcnJheSgpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgPT0gbnVsbCkgewotCQkJdGhpcy5jYXRhbG9ncyA9IHRoaXMuYnVpbGRDYXRhbG9nQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jYXRhbG9nczsKLQl9Ci0KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gYnVpbGRDYXRhbG9nQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGR0cENhdGFsb2dzID0gdGhpcy5nZXREVFBDYXRhbG9ncygpOwotCQlEVFBDYXRhbG9nV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDYXRhbG9nV3JhcHBlcltkdHBDYXRhbG9ncy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBDYXRhbG9nV3JhcHBlcih0aGlzLCBkdHBDYXRhbG9ncy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5nZXRDYXRhbG9ncyh0aGlzLmR0cERhdGFiYXNlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhdGFsb2dzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY2F0YWxvZyBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY2F0YWxvZwotCSAqLwotCURUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2cob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmdldENhdGFsb2dBcnJheSgpKSB7Ci0JCQlpZiAoY2F0YWxvZy53cmFwcyhkdHBDYXRhbG9nKSkgewotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIGNhdGFsb2c6ICIgKyBkdHBDYXRhbG9nKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENhdGFsb2dXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRDYXRhbG9nV3JhcHBlcnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBDYXRhbG9nV3JhcHBlciBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ0Zvck5hbWVzKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dOYW1lcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdENhdGFsb2dOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmdldERlZmF1bHRDYXRhbG9nTmFtZXModGhpcy5kdHBEYXRhYmFzZSwgdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgY2F0YWxvZyBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dGb3JOYW1lcyhJdGVyYWJsZTxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKG5hbWUpOwotCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGZpbmQgYSBkZWZhdWx0IGNhdGFsb2csIHJldHVybiBpdHMgaWRlbnRpZmllcjsKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgbGFzdCBuYW1lIG9uIHRoZSBsaXN0IG9mIGRlZmF1bHQgbmFtZXMuCi0JICogKFNvbWUgZGF0YWJhc2VzIGhhdmUgbXVsdGlwbGUgcG9zc2libGUgZGVmYXVsdCBuYW1lcy4pCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IG5hbWVzID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCk7Ci0JCURUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dGb3JOYW1lcyhuYW1lcyk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCXJldHVybiBjYXRhbG9nLmdldElkZW50aWZpZXIoKTsKLQkJfQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXJldHVybiBzdHJlYW0uaGFzTmV4dCgpID8gdGhpcy5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihDb2xsZWN0aW9uVG9vbHMubGFzdChzdHJlYW0pKSA6IG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKHRoaXMuZHRwRGF0YWJhc2UsIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXRVc2VyTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZXMgdnMuIGlkZW50aWZpZXJzICoqKioqKioqKioKLQotCS8vIG92ZXJyaWRlIHRvIG1ha2UgbWV0aG9kIHB1YmxpYyBzaW5jZSBpdCdzIGluIHRoZSBEYXRhYmFzZSBpbnRlcmZhY2UKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZSB0byB0aGUgdmVuZG9yLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcl8oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlbGVnYXRlIHRvIHRoZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lXyhTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gYW4gaWRlbnRpZmllci4gUmV0dXJuIG51bGwgaWYgdGhlIHJlc3VsdGluZwotCSAqIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgbmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIG9sZCBlbnRpdHkgZ2VuZXJhdGlvbiBjb2RlIHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogYSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBtdXN0IGV4cGxpY2l0bHkgaWRlbnRpZnkgYSBkYXRhYmFzZSBvYmplY3QKLQkgKiAoZS5nLiBhIHRhYmxlKSBvciB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgYWRlcXVhdGVseSBpZGVudGlmaWVzIHRoZQotCSAqIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgKHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gY2FzZS1zZW5zaXRpdml0eQotCSAqIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMpLgotCSAqLwotCS8vIFRPRE8gYWRkIHRvIGRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlcj8gY3VycmVudGx5IG5vdCB1c2VkLi4uCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUsIGRlZmF1bHROYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlEYXRhYmFzZURlZmluaXRpb24gZ2V0RFRQRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIFJEQkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERhdGFiYXNlRGVmaW5pdGlvblJlZ2lzdHJ5KCkuZ2V0RGVmaW5pdGlvbih0aGlzLmR0cERhdGFiYXNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydENhdGFsb2dzKCkgewotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSB7Ci0JCQljYXRhbG9nLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcENhdGFsb2dzKCkgewotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSB7Ci0JCQljYXRhbG9nLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckNhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJDYXRhbG9ncygpIHsKLQkJdGhpcy5zdG9wQ2F0YWxvZ3MoKTsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5jbGVhcigpOwotCQl9Ci0JCXRoaXMuY2F0YWxvZ3MgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRm9yZWlnbktleVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2EwZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRm9yZWlnbktleVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBGb3JlaWduS2V5Ci0gKi8KLWZpbmFsIGNsYXNzIERUUEZvcmVpZ25LZXlXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIEZvcmVpZ25LZXkKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGZvcmVpZ24ga2V5ICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXk7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyIHJlZmVyZW5jZWRUYWJsZTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBMb2NhbENvbHVtblBhaXJbXSBjb2x1bW5QYWlyczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkIC0gYnV0IGl0IGNhbiBiZSAnbnVsbCcgc28gd2UgdXNlIGEgZmxhZyAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSBmYWxzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBGb3JlaWduS2V5V3JhcHBlcihEVFBUYWJsZVdyYXBwZXIgYmFzZVRhYmxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXkpIHsKLQkJc3VwZXIoYmFzZVRhYmxlLCBkdHBGb3JlaWduS2V5KTsKLQkJdGhpcy5kdHBGb3JlaWduS2V5ID0gZHRwRm9yZWlnbktleTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmZvcmVpZ25LZXlDaGFuZ2VkKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpICsgIjogIiArIEFycmF5cy5hc0xpc3QodGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKSkpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBGb3JlaWduS2V5IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRCYXNlVGFibGUoKSB7Ci0JCXJldHVybiAoRFRQVGFibGVXcmFwcGVyKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRFRQVGFibGVXcmFwcGVyIGdldFJlZmVyZW5jZWRUYWJsZSgpIHsKLQkJaWYgKHRoaXMucmVmZXJlbmNlZFRhYmxlID09IG51bGwpIHsKLQkJCXRoaXMucmVmZXJlbmNlZFRhYmxlID0gdGhpcy5nZXRCYXNlVGFibGUoKS5nZXRUYWJsZSh0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0VW5pcXVlQ29uc3RyYWludCgpLmdldEJhc2VUYWJsZSgpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkVGFibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKSB7Ci0JCWlmICh0aGlzLmdldENvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodGhpcy5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUGFpcigpLmdldFJlZmVyZW5jZWRDb2x1bW4oKSA9PSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQl9Ci0KLQkvLyAqKioqKiBjb2x1bW4gcGFpcnMKLQotCXB1YmxpYyBJdGVyYWJsZTxDb2x1bW5QYWlyPiBnZXRDb2x1bW5QYWlycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENvbHVtblBhaXI+KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpOwotCX0KLQotCXB1YmxpYyBMb2NhbENvbHVtblBhaXIgZ2V0Q29sdW1uUGFpcigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyW10gcGFpcnMgPSB0aGlzLmdldENvbHVtblBhaXJBcnJheSgpOwotCQlpZiAocGFpcnMubGVuZ3RoICE9IDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm11bHRpcGxlIGNvbHVtbiBwYWlyczogIiArIHBhaXJzLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBhaXJzWzBdOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8TG9jYWxDb2x1bW5QYWlyPiBnZXRMb2NhbENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8TG9jYWxDb2x1bW5QYWlyPih0aGlzLmdldENvbHVtblBhaXJBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBMb2NhbENvbHVtblBhaXJbXSBnZXRDb2x1bW5QYWlyQXJyYXkoKSB7Ci0JCWlmICh0aGlzLmNvbHVtblBhaXJzID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uUGFpcnMgPSB0aGlzLmJ1aWxkQ29sdW1uUGFpckFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uUGFpcnM7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbENvbHVtblBhaXJbXSBidWlsZENvbHVtblBhaXJBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBiYXNlQ29sdW1ucyA9IHRoaXMuZ2V0RFRQQmFzZUNvbHVtbnMoKTsKLQkJaW50IHNpemUgPSBiYXNlQ29sdW1ucy5zaXplKCk7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gcmVmQ29sdW1ucyA9IHRoaXMuZ2V0RFRQUmVmZXJlbmNlQ29sdW1ucygpOwotCQlpZiAocmVmQ29sdW1ucy5zaXplKCkgIT0gc2l6ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmdldEJhc2VUYWJsZSgpLmdldE5hbWUoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpICsKLQkJCQkJCQkJIiAtIG1pc21hdGNoZWQgc2l6ZXM6ICIgKyBzaXplICsgIiB2cy4gIiArIHJlZkNvbHVtbnMuc2l6ZSgpKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlMb2NhbENvbHVtblBhaXJbXSByZXN1bHQgPSBuZXcgTG9jYWxDb2x1bW5QYWlyW2Jhc2VDb2x1bW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSBiYXNlQ29sdW1ucy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0W2ldID0gbmV3IExvY2FsQ29sdW1uUGFpcigKLQkJCQkJCQkJdGhpcy5nZXRCYXNlVGFibGUoKS5nZXRDb2x1bW4oYmFzZUNvbHVtbnMuZ2V0KGkpKSwKLQkJCQkJCQkJdGhpcy5nZXRCYXNlVGFibGUoKS5nZXRDb2x1bW4ocmVmQ29sdW1ucy5nZXQoaSkpCi0JCQkJCQkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBDb2x1bW5QYWlyLkJBU0VfQ09MVU1OX0NPTVBBUkFUT1IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0RFRQQmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0TWVtYmVycygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0RFRQUmVmZXJlbmNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0TWVtYmVycygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uUGFpcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0QmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5nZXRMb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIHBhaXIpIHsKLQkJCQlyZXR1cm4gcGFpci5nZXRCYXNlQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JYm9vbGVhbiBiYXNlQ29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEJhc2VDb2x1bW5zKCksIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0Tm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPENvbHVtbj4odGhpcy5nZXRCYXNlQ29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDb2x1bW4gY29sdW1uKSB7Ci0JCQkJcmV0dXJuICEgY29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxDb2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TG9jYWxDb2x1bW5QYWlyLCBDb2x1bW4+KHRoaXMuZ2V0TG9jYWxDb2x1bW5QYWlycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtKExvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyKSB7Ci0JCQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqIGF0dHJpYnV0ZSBuYW1lCi0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0TmFtZSA9IHRoaXMuZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKTsKLQkJcmV0dXJuIChkZWZhdWx0TmFtZSAhPSBudWxsKSA/IGRlZmF1bHROYW1lIDogdGhpcy5nZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRBdHRyaWJ1dGVOYW1lKCkgewotCQlpZiAoICEgdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQpIHsKLQkJCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKLQkJCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWUgPSB0aGlzLmJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRBdHRyaWJ1dGVOYW1lKCkgewotCQlpZiAoICEgdGhpcy5yZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMb2NhbENvbHVtblBhaXIgY29sdW1uUGFpciA9IHRoaXMuZ2V0Q29sdW1uUGFpcigpOwotCQlTdHJpbmcgYmFzZUNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCVN0cmluZyByZWZDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlpZiAoYmFzZUNvbE5hbWUubGVuZ3RoKCkgPD0gKHJlZkNvbE5hbWUubGVuZ3RoKCkgKyAxKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCAhIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgX2luZGV4ID0gYmFzZUNvbE5hbWUubGVuZ3RoKCkgLSByZWZDb2xOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGJhc2VDb2xOYW1lLmNoYXJBdChfaW5kZXgpICE9ICdfJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGJhc2VDb2xOYW1lLnN1YnN0cmluZygwLCBfaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgYSBzaW1wbGUgKHNpbmdsZS1jb2x1bW4pIGZvcmVpZ24ga2V5LCB1c2UgdGhlIG5hbWUgb2YgdGhlCi0JICogc2luZ2xlIGJhc2UgY29sdW1uIHRvIGJ1aWxkIGEgbmFtZS4gSWYgdGhpcyBpcyBhIGNvbXBvdW5kIGZvcmVpZ24ga2V5LAotCSAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCB0YWJsZS4KLQkgKi8KLQkvLyBUT0RPIGlmIHRoZXJlIGlzIG9ubHkgb25lIEZLIHRvIGEgZ2l2ZW4gdGFibGUsIHVzZSB0aGUgdGFibGUncyBuYW1lIGluc3RlYWQgb2YgdGhlIGNvbHVtbidzIG5hbWU/Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRDb2x1bW5QYWlyc1NpemUoKSA9PSAxKSA/Ci0JCQkJCQl0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lRnJvbUJhc2VDb2x1bW4oKSA6Ci0JCQkJCQl0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJzY29yZSBjaGVjayBpcyBoZWxwZnVsIHdoZW4gdGhlIHJlZmVyZW5jZWQgY29sdW1uIGlzIDxlbT5ub3Q8L2VtPiB0aGUKLQkgKiBwcmltYXJ5IGtleSBvZiB0aGUgcmVmZXJlbmNlZCB0YWJsZSAoaS5lLiBpdCBoYXMgb25seSBhIDxlbT51bmlxdWU8L2VtPiBjb25zdHJhaW50KS4KLQkgKiA8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFSUQgID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX1BLID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFX1BLIgotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lRnJvbUJhc2VDb2x1bW4oKSB7Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWludCBsZW4gPSBiYXNlQ29sTmFtZS5sZW5ndGgoKTsKLQkJaW50IHJlZkxlbiA9IHJlZkNvbE5hbWUubGVuZ3RoKCk7Ci0JCWlmICgobGVuID4gcmVmTGVuKSAmJiBiYXNlQ29sTmFtZS5lbmRzV2l0aChyZWZDb2xOYW1lKSkgewotCQkJbGVuID0gbGVuIC0gcmVmTGVuOwotCQkJaWYgKChsZW4gPiAxKSAmJiBiYXNlQ29sTmFtZS5jaGFyQXQobGVuIC0gMSkgPT0gJ18nKSB7Ci0JCQkJbGVuID0gbGVuIC0gMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIGxlbik7Ci0JfQotCi0JLyoqCi0JICogRXhhbXBsZXM6PHVsPgotCSAqIDxsaT5PcmFjbGUgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRk9PX0lEID0+IElEKSB2cy4gImZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gRk9PX0lEKSB2cy4gImZvbyIgPT4gIkZPT19JRCIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRk9PID0+IElEKSB2cy4gImZvbyIgPT4gIkZPTyIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gIlwiRm9vX0lEXCIiCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlBvc3RncmVTUUwgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoZm9vX2lkID0+IGlkKSB2cy4gImZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29faWQgPT4gZm9vX2lkKSB2cy4gImZvbyIgPT4gImZvb19pZCIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoZm9vID0+IGlkKSB2cy4gImZvbyIgPT4gImZvbyIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gIlwiRm9vX0lEXCIiCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlNRTCBTZXJ2ZXIgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoZm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gRk9PX0lEKSB2cy4gImZvbyIgPT4gIkZPT19JRCIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRk9PID0+IElEKSB2cy4gImZvbyIgPT4gIkZPTyIKLQkgKiAgICAgPGxpPkZvcmVpZ25LZXkoRm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gIkZvb19JRCIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyBiYXNlQ29sdW1uTmFtZSA9IHRoaXMuZ2V0Q29sdW1uUGFpcigpLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZWZhdWx0QmFzZUNvbHVtbk5hbWUgPSBhdHRyaWJ1dGVOYW1lICsgJ18nICsgdGhpcy5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKGJhc2VDb2x1bW5OYW1lLCBkZWZhdWx0QmFzZUNvbHVtbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkgPT0gZm9yZWlnbktleTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJLy8gdGhlIGZvcmVpZ24ga2V5IGRvZXMgbm90ICJjb250YWluIiBhbnkgb3RoZXIgb2JqZWN0cywKLQkJLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBmb3J3YXJkIHRoZSAjY2xlYXIoKQotCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCA9IGZhbHNlOwotCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJdGhpcy5jb2x1bW5QYWlycyA9ICBudWxsOwotCQl0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBMb2NhbENvbHVtblBhaXIgaW1wbGVtZW50cyBDb2x1bW5QYWlyIHsKLQkJcHJpdmF0ZSBmaW5hbCBEVFBDb2x1bW5XcmFwcGVyIGJhc2VDb2x1bW47Ci0JCXByaXZhdGUgZmluYWwgRFRQQ29sdW1uV3JhcHBlciByZWZlcmVuY2VkQ29sdW1uOwotCi0JCUxvY2FsQ29sdW1uUGFpcihEVFBDb2x1bW5XcmFwcGVyIGJhc2VDb2x1bW4sIERUUENvbHVtbldyYXBwZXIgcmVmZXJlbmNlZENvbHVtbikgewotCQkJc3VwZXIoKTsKLQkJCWlmICgoYmFzZUNvbHVtbiA9PSBudWxsKSB8fCAocmVmZXJlbmNlZENvbHVtbiA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5iYXNlQ29sdW1uID0gYmFzZUNvbHVtbjsKLQkJCXRoaXMucmVmZXJlbmNlZENvbHVtbiA9IHJlZmVyZW5jZWRDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgRFRQQ29sdW1uV3JhcHBlciBnZXRCYXNlQ29sdW1uKCkgewotCQkJcmV0dXJuIHRoaXMuYmFzZUNvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldFJlZmVyZW5jZWRDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJhc2VDb2x1bW4uZ2V0TmFtZSgpICsgIj0+IiArIHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXROYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNWQ2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFDb250YWluZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogQ29hbGVzY2UgYmVoYXZpb3IgZm9yIGEgc2NoZW1hIGNvbnRhaW5lciAoaS5lLiBkYXRhYmFzZSBvciBjYXRhbG9nKS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBTY2hlbWFDb250YWluZXIKLXsKLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQU2NoZW1hV3JhcHBlcltdIHNjaGVtYXRhOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIoRFRQRGF0YWJhc2VPYmplY3QgcGFyZW50LCBPYmplY3QgZHRwU2NoZW1hQ29udGFpbmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZHRwU2NoZW1hQ29udGFpbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWJzdHJhY3QgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNjaGVtYSBjb250YWluZXIncyBEVFAgc2NoZW1hdGEKLQkgKi8KLQlhYnN0cmFjdCBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXRhKCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNjaGVtYSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgc2NoZW1hCi0JICovCi0JYWJzdHJhY3QgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpOwotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbmVyIChkYXRhYmFzZSBvciBjYXRhbG9nKSBjb250YWlucwotCSAqIHRoZSBzcGVjaWZpZWQgc2NoZW1hCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFfKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLmdldFNjaGVtYUFycmF5KCkpIHsKLQkJCWlmIChzY2hlbWEud3JhcHMoZHRwU2NoZW1hKSkgewotCQkJCXJldHVybiBzY2hlbWE7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgc2NoZW1hOiAiICsgZHRwU2NoZW1hKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIERUUCB0YWJsZTsKLQkgKiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBzY2hlbWEgKHRvIGl0cyBjb250YWluZXIpCi0JICovCi0JYWJzdHJhY3QgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSk7Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWluZXIgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYV8oZHRwVGFibGUuZ2V0U2NoZW1hKCkpLmdldFRhYmxlXyhkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgRFRQIGNvbHVtbjsKLQkgKiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBzY2hlbWEgKHRvIGl0cyBjb250YWluZXIpCi0JICovCi0JYWJzdHJhY3QgRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pOwotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbmVyIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWF0YSAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFNjaGVtYT4odGhpcy5nZXRTY2hlbWFBcnJheSgpKTsKLQl9Ci0KLQlJdGVyYWJsZTxEVFBTY2hlbWFXcmFwcGVyPiBnZXRTY2hlbWFXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFNjaGVtYVdyYXBwZXI+KHRoaXMuZ2V0U2NoZW1hQXJyYXkoKSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIERUUFNjaGVtYVdyYXBwZXJbXSBnZXRTY2hlbWFBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWF0YSA9IHRoaXMuYnVpbGRTY2hlbWFBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNjaGVtYXRhOwotCX0KLQotCXByaXZhdGUgRFRQU2NoZW1hV3JhcHBlcltdIGJ1aWxkU2NoZW1hQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEgPSB0aGlzLmdldERUUFNjaGVtYXRhKCk7Ci0JCURUUFNjaGVtYVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQU2NoZW1hV3JhcHBlcltkdHBTY2hlbWF0YS5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQU2NoZW1hV3JhcHBlcih0aGlzLCBkdHBTY2hlbWF0YS5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NoZW1hdGFTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFOYW1lcygpIHsKLQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBOQU1FX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0U2NoZW1hV3JhcHBlcnMoKSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSBzY2hlbWF0YSBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0U2NoZW1hV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyh0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3Qgc2NoZW1hIGZvdW5kLgotCSAqLwotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hRm9yTmFtZXMoSXRlcmFibGU8U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLQkJCURUUFNjaGVtYVdyYXBwZXIgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFOYW1lZChuYW1lKTsKLQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCXJldHVybiBzY2hlbWE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZmluZCBhIGRlZmF1bHQgc2NoZW1hLCByZXR1cm4gaXRzIGlkZW50aWZpZXI7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGxhc3QgbmFtZSBvbiB0aGUgbGlzdCBvZiBkZWZhdWx0IG5hbWVzLgotCSAqIChTb21lIGNvbnRhaW5lcnMgaGF2ZSBtdWx0aXBsZSBwb3NzaWJsZSBkZWZhdWx0IG5hbWVzLikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBuYW1lcyA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hTmFtZXMoKTsKLQkJRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYUZvck5hbWVzKG5hbWVzKTsKLQkJLy8gYXNzdW1lICduYW1lcycgaXMgbm9uLWVtcHR5ICghKQotCQlyZXR1cm4gKHNjaGVtYSAhPSBudWxsKSA/Ci0JCQkJc2NoZW1hLmdldElkZW50aWZpZXIoKSA6Ci0JCQkJdGhpcy5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihDb2xsZWN0aW9uVG9vbHMubGFzdChuYW1lcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRTY2hlbWF0YSgpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2NoZW1hdGEoKSB7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLnNjaGVtYXRhKSB7Ci0JCQlzY2hlbWEuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcFNjaGVtYXRhKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2NoZW1hdGEoKSB7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLnNjaGVtYXRhKSB7Ci0JCQlzY2hlbWEuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyU2NoZW1hdGEoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclNjaGVtYXRhKCkgewotCQl0aGlzLnN0b3BTY2hlbWF0YSgpOwotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5zY2hlbWF0YSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWIzNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuU1FMVGFibGVzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2NoZW1hCi0gKi8KLWZpbmFsIGNsYXNzIERUUFNjaGVtYVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgU2NoZW1hCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBzY2hlbWEgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlcltdIHRhYmxlczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBzZXF1ZW5jZXM7Ci0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0JCi0JLyoqIHVzZWQgZm9yIGFkb3B0ZXIgcHJvZHVjdCBjdXN0b21pemF0aW9uICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkgPSAic3VwcG9ydFBlcnNpc3RlbnRBbmRWaWV3VGFibGVzT25seSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBTY2hlbWFXcmFwcGVyKERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgY29udGFpbmVyLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlzdXBlcihjb250YWluZXIsIGR0cFNjaGVtYSk7Ci0JCXRoaXMuZHRwU2NoZW1hID0gZHRwU2NoZW1hOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuc2NoZW1hQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2NoZW1hIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiAoRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcikgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvLyAqKioqKiB0YWJsZXMKLQotCXB1YmxpYyBJdGVyYWJsZTxUYWJsZT4gZ2V0VGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8VGFibGU+KHRoaXMuZ2V0VGFibGVBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUFRhYmxlV3JhcHBlcj4gZ2V0VGFibGVXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFRhYmxlV3JhcHBlcj4odGhpcy5nZXRUYWJsZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUFRhYmxlV3JhcHBlcltdIGdldFRhYmxlQXJyYXkoKSB7Ci0JCWlmICh0aGlzLnRhYmxlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlcyA9IHRoaXMuYnVpbGRUYWJsZUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGFibGVzOwotCX0KLQotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyW10gYnVpbGRUYWJsZUFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5nZXREVFBUYWJsZXMoKTsKLQkJRFRQVGFibGVXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUFRhYmxlV3JhcHBlcltkdHBUYWJsZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQVGFibGVXcmFwcGVyKHRoaXMsIGR0cFRhYmxlcy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGdldERUUFRhYmxlcygpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGR0cFRhYmxlcyA9IHRoaXMuZ2V0RFRQVGFibGVzXygpOwotCQlyZXR1cm4gdGhpcy5oYWNrKCkgPyB0aGlzLmhhY2soZHRwVGFibGVzKSA6IGR0cFRhYmxlczsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZ2V0RFRQVGFibGVzXygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFRhYmxlcygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYWNrKCkgewotCQlTdHJpbmcgaGFjayA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eShQRVJTSVNURU5UX0FORF9WSUVXX1RBQkxFU19PTkxZKTsKLQkJcmV0dXJuIChoYWNrICE9IG51bGwpICYmIGhhY2suZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBoYWNrKExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPigpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSA6IGR0cFRhYmxlcykgewotCQkJaWYgKHRoaXMuaGFjayhkdHBUYWJsZSkpIHsKLQkJCQlyZXN1bHQuYWRkKGR0cFRhYmxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYWNrKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFRhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSkgfHwKLQkJCQkJU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Vmlld1RhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFRhYmxlLmdldFNjaGVtYSgpKSA/Ci0JCQkJCQl0aGlzLmdldFRhYmxlXyhkdHBUYWJsZSkgOgotCQkJCQkJdGhpcy5nZXRDb250YWluZXIoKS5nZXRUYWJsZShkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy5nZXRUYWJsZUFycmF5KCkpIHsKLQkJCWlmICh0YWJsZS53cmFwcyhkdHBUYWJsZSkpIHsKLQkJCQlyZXR1cm4gdGFibGU7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRUYWJsZVdyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSB0YWJsZXMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFRhYmxlV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVXcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyAqKioqKiBzZXF1ZW5jZXMKLQotCXB1YmxpYyBJdGVyYWJsZTxTZXF1ZW5jZT4gZ2V0U2VxdWVuY2VzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U2VxdWVuY2U+KHRoaXMuZ2V0U2VxdWVuY2VBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUFNlcXVlbmNlV3JhcHBlcj4gZ2V0U2VxdWVuY2VXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFNlcXVlbmNlV3JhcHBlcj4odGhpcy5nZXRTZXF1ZW5jZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUFNlcXVlbmNlV3JhcHBlcltdIGdldFNlcXVlbmNlQXJyYXkoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlcyA9IHRoaXMuYnVpbGRTZXF1ZW5jZUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VzOwotCX0KLQotCXByaXZhdGUgRFRQU2VxdWVuY2VXcmFwcGVyW10gYnVpbGRTZXF1ZW5jZUFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZHRwU2VxdWVuY2VzID0gdGhpcy5nZXREVFBTZXF1ZW5jZXMoKTsKLQkJRFRQU2VxdWVuY2VXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUFNlcXVlbmNlV3JhcHBlcltkdHBTZXF1ZW5jZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQU2VxdWVuY2VXcmFwcGVyKHRoaXMsIGR0cFNlcXVlbmNlcy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlPiBnZXREVFBTZXF1ZW5jZXMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYS5nZXRTZXF1ZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlcXVlbmNlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNlcXVlbmNlQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIERUUFNlcXVlbmNlV3JhcHBlciBnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRTZXF1ZW5jZVdyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSBzZXF1ZW5jZXMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFNlcXVlbmNlV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUFNlcXVlbmNlV3JhcHBlciBnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2VxdWVuY2VXcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYSA9PSBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgRFRQIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbl8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVfKGR0cENvbHVtbi5nZXRUYWJsZSgpKS5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydFRhYmxlcygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2VxdWVuY2VzKCkgewotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0VGFibGVzKCkgewotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcFNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BUYWJsZXMoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BTZXF1ZW5jZXMoKSB7Ci0JCWZvciAoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlIDogdGhpcy5zZXF1ZW5jZXMpIHsKLQkJCXNlcXVlbmNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wVGFibGVzKCkgewotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyU2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJUYWJsZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclNlcXVlbmNlcygpIHsKLQkJdGhpcy5zdG9wU2VxdWVuY2VzKCk7Ci0JCWZvciAoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlIDogdGhpcy5zZXF1ZW5jZXMpIHsKLQkJCXNlcXVlbmNlLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5zZXF1ZW5jZXMgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclRhYmxlcygpIHsKLQkJdGhpcy5zdG9wVGFibGVzKCk7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy50YWJsZXMpIHsKLQkJCXRhYmxlLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy50YWJsZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2VxdWVuY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTNlZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2VxdWVuY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTZXF1ZW5jZQotICovCi1maW5hbCBjbGFzcyBEVFBTZXF1ZW5jZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgU2VxdWVuY2UKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHNlcXVlbmNlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2VxdWVuY2VXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2UpIHsKLQkJc3VwZXIoc2NoZW1hLCBkdHBTZXF1ZW5jZSk7Ci0JCXRoaXMuZHRwU2VxdWVuY2UgPSBkdHBTZXF1ZW5jZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNlcXVlbmNlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VxdWVuY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTZXF1ZW5jZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKERUUFNjaGVtYVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2VxdWVuY2UgPT0gc2VxdWVuY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDk2NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLlByaW1hcnlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkJhc2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBUYWJsZQotICovCi1maW5hbCBjbGFzcyBEVFBUYWJsZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgVGFibGUKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHRhYmxlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGU7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGNvbHVtbnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIHByaW1hcnlLZXlDb2x1bW5zOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gZm9yZWlnbktleXM7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUUENvbHVtbldyYXBwZXJbXSBFTVBUWV9DT0xVTU5TID0gbmV3IERUUENvbHVtbldyYXBwZXJbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBFTVBUWV9GT1JFSUdOX0tFWVMgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQVGFibGVXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJc3VwZXIoc2NoZW1hLCBkdHBUYWJsZSk7Ci0JCXRoaXMuZHRwVGFibGUgPSBkdHBUYWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnRhYmxlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKERUUFNjaGVtYVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8gKioqKiogY29sdW1ucwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENvbHVtbj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUENvbHVtbldyYXBwZXI+IGdldENvbHVtbldyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ29sdW1uV3JhcHBlcj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0Q29sdW1uQXJyYXkoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5zID0gdGhpcy5idWlsZENvbHVtbkFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBidWlsZENvbHVtbkFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmdldERUUENvbHVtbnMoKTsKLQkJRFRQQ29sdW1uV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDb2x1bW5XcmFwcGVyW2R0cENvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQQ29sdW1uV3JhcHBlcih0aGlzLCBkdHBDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXRDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cENvbHVtbi5nZXRUYWJsZSgpKSA/Ci0JCQkJCQl0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKSA6Ci0JCQkJCQl0aGlzLmdldFNjaGVtYSgpLmdldENvbHVtbihkdHBDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgdGFibGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbl8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQXJyYXkoKSkgewotCQkJaWYgKGNvbHVtbi53cmFwcyhkdHBDb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCBjb2x1bW46ICIgKyBkdHBDb2x1bW4pOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgewotCQkvLyB0aGUgY29sdW1ucyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q29sdW1uV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRDb2x1bW5XcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyAqKioqKiBwcmltYXJ5S2V5Q29sdW1ucwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb2x1bW4+KHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkpOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCURUUENvbHVtbldyYXBwZXJbXSBwa0NvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQlpZiAocGtDb2x1bW5zLmxlbmd0aCAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtdWx0aXBsZSBwcmltYXJ5IGtleSBjb2x1bW5zOiAiICsgcGtDb2x1bW5zLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBrQ29sdW1uc1swXTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gdGhpcy5idWlsZFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGJ1aWxkUHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlQcmltYXJ5S2V5IHBrID0gKChCYXNlVGFibGUpIHRoaXMuZHRwVGFibGUpLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKHBrID09IG51bGwpIHsKLQkJCS8vIG5vIFBLIHdhcyBkZWZpbmVkCi0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IHBrQ29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1ucyhwayk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltwa0NvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSB0aGlzLmdldENvbHVtbihwa0NvbHVtbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0Q29sdW1ucyhQcmltYXJ5S2V5IHBrKSB7Ci0JCXJldHVybiBway5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlib29sZWFuIHByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyh0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLCBjb2x1bW4pOwotCX0KLQotCS8vICoqKioqIGZvcmVpZ25LZXlzCi0KLQlwdWJsaWMgSXRlcmFibGU8Rm9yZWlnbktleT4gZ2V0Rm9yZWlnbktleXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxGb3JlaWduS2V5Pih0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGdldEZvcmVpZ25LZXlBcnJheSgpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5cyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5QXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5czsKLQl9Ci0KLQlwcml2YXRlIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gYnVpbGRGb3JlaWduS2V5QXJyYXkoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBFTVBUWV9GT1JFSUdOX0tFWVM7Ci0JCX0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBkdHBGb3JlaWduS2V5cyA9IHRoaXMuZ2V0RFRQRm9yZWlnbktleXMoKTsKLQkJRFRQRm9yZWlnbktleVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbZHRwRm9yZWlnbktleXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXIodGhpcywgZHRwRm9yZWlnbktleXMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBnZXREVFBGb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRGb3JlaWduS2V5cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Rm9yZWlnbktleXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgYSBiYXNlIGNvbHVtbiBmb3IgYXQgbGVhc3Qgb25lCi0JICogb2YgdGhlIHRoZSB0YWJsZSdzIGZvcmVpZ24ga2V5cwotCSAqLwotCWJvb2xlYW4gZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZrV3JhcHBlciA6IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KCkpIHsKLQkJCWlmIChma1dyYXBwZXIuYmFzZUNvbHVtbnNDb250YWlucyhjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqIGpvaW4gdGFibGUKLQotCXB1YmxpYyBib29sZWFuIGlzUG9zc2libGVKb2luVGFibGUoKSB7Ci0JCWlmICh0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpLmxlbmd0aCAhPSAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgdGFibGUgbXVzdCBoYXZlIGV4YWN0bHkgMiBmb3JlaWduIGtleXMKLQkJfQotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0aGlzLmdldENvbHVtbnMoKSkgewotCQkJaWYgKCAhIHRoaXMuZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIGFsbCB0aGUgdGFibGUncyBjb2x1bW5zIG11c3QgYmVsb25nIHRvIG9uZSAob3IgYm90aCkgb2YgdGhlIDIgZm9yZWlnbiBrZXlzCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHRhYmxlIG5hbWUgaXMgPGNvZGU+Rk9PX0JBUjwvY29kZT4KLQkgKiBhbmQgaXQgam9pbnMgdGFibGVzIDxjb2RlPkZPTzwvY29kZT4gYW5kIDxjb2RlPkJBUjwvY29kZT4sCi0JICogcmV0dXJuIHRoZSBmb3JlaWduIGtleSB0byA8Y29kZT5GT088L2NvZGU+OwotCSAqIGlmIHRoZSB0YWJsZSBuYW1lIGlzIDxjb2RlPkJBUl9GT088L2NvZGU+Ci0JICogYW5kIGl0IGpvaW5zIHRhYmxlcyA8Y29kZT5GT088L2NvZGU+IGFuZCA8Y29kZT5CQVI8L2NvZGU+LAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gPGNvZGU+QkFSPC9jb2RlPjsKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiB0aGUgZmlyc3QgZm9yZWlnbiBrZXkgaW4gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCUZvcmVpZ25LZXkgZmswID0gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKVswXTsKLQkJU3RyaW5nIG5hbWUwID0gZmswLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKTsKLQotCQlGb3JlaWduS2V5IGZrMSA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMV07Ci0JCVN0cmluZyBuYW1lMSA9IGZrMS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCk7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyhuYW1lMSArICdfJyArIG5hbWUwKSA/IGZrMSA6IGZrMDsKLQl9Ci0KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luVGFibGVOb25Pd25pbmdGb3JlaWduS2V5KCkgewotCQlGb3JlaWduS2V5IGZrMCA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMF07Ci0JCUZvcmVpZ25LZXkgZmsxID0gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKVsxXTsKLQkJRm9yZWlnbktleSBvZmsgPSB0aGlzLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKTsKLQkJcmV0dXJuIChvZmsgPT0gZmswKSA/IGZrMSA6IGZrMDsKLQl9Ci0KLQkvKioKLQkgKiBIbW1tLi4uLgotCSAqIFdlIG1pZ2h0IHdhbnQgdG8gZ28gdG8gdGhlIHBsYXRmb3JtIHRvIGFsbG93IGEgdmVuZG9yLXNwZWNpZmljCi0JICogY29tcGFyaXNvbiBoZXJlOwotCSAqIGJ1dCwgc2luY2UgYWxsIHRoZSBuYW1lcyBhcmUgY29taW5nIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlCi0JICogKGkuZS4gdGhlcmUgYXJlIG5vIGNvbnZlcnNpb25zIHRvIEphdmEgaWRlbnRpZmllcnMgZXRjLiksIGl0IHNlZW1zCi0JICogbGlrZSB3ZSBjYW4ganVzdCBjb21wYXJlIHRoZW0gZGlyZWN0bHkgYW5kIGlnbm9yZSBjYXNlLXNlbnNpdGl2aXR5Ci0JICogaXNzdWVzLi4uLiAgfmJqdgotCSAqLwotCXB1YmxpYyBib29sZWFuIGpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHModGhpcy5idWlsZERlZmF1bHRKb2luVGFibGVOYW1lKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5UYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU93bmluZ1RhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJCSsgJ18nCi0JCQkJCSsgdGhpcy5nZXRKb2luVGFibGVOb25Pd25pbmdUYWJsZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGdldEpvaW5UYWJsZU93bmluZ1RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRKb2luVGFibGVOb25Pd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlID09IHRhYmxlOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSB0YWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKHRhYmxlKSA/IHRoaXMgOiB0aGlzLmdldFNjaGVtYSgpLmdldFRhYmxlKHRhYmxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5mb3JlaWduS2V5cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Rm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDb2x1bW5zKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sdW1ucygpIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuY29sdW1ucykgewotCQkJY29sdW1uLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5mb3JlaWduS2V5cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BGb3JlaWduS2V5cygpOwotCQl9Ci0JCWlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wQ29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcEZvcmVpZ25LZXlzKCkgewotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkgOiB0aGlzLmZvcmVpZ25LZXlzKSB7Ci0JCQlmb3JlaWduS2V5LnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wQ29sdW1ucygpIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuY29sdW1ucykgewotCQkJY29sdW1uLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckZvcmVpZ25LZXlzKCk7Ci0JCX0KLQotCQkvLyB0aGUgdGFibGUgZG9lcyBub3QgImNvbnRhaW4iIHRoZSBwayBjb2x1bW5zLCBzbyBubyBuZWVkIHRvIGZvcndhcmQgI2NsZWFyKCkKLQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IG51bGw7Ci0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyQ29sdW1ucygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRm9yZWlnbktleXMoKSB7Ci0JCXRoaXMuc3RvcEZvcmVpZ25LZXlzKCk7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmZvcmVpZ25LZXlzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJDb2x1bW5zKCkgewotCQl0aGlzLnN0b3BDb2x1bW5zKCk7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5jbGVhcigpOwotCQl9Ci0gICAgCXRoaXMuY29sdW1ucyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQWJzdHJhY3RWZW5kb3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9BYnN0cmFjdFZlbmRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZhMDhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9BYnN0cmFjdFZlbmRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDb25zb2xpZGF0ZSB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIHRoZSB0eXBpY2FsIHZlbmRvcnMuCi0gKiAKLSAqIEBzZWUgVW5yZWNvZ25pemVkVmVuZG9yCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVuZG9yCi0JaW1wbGVtZW50cyBWZW5kb3IKLXsKLQlBYnN0cmFjdFZlbmRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nIGFuZCBzY2hlbWEgc3VwcG9ydCAqKioqKioqKioqCi0KLQlhYnN0cmFjdCBDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLnN1cHBvcnRzQ2F0YWxvZ3MoZGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLmdldENhdGFsb2dzKGRhdGFiYXNlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLmdldFNjaGVtYXMoZGF0YWJhc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ2ZW5kb3I6ICIgKyB0aGlzLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSkgewotCQlpZiAoICEgdGhpcy5zdXBwb3J0c0NhdGFsb2dzKGRhdGFiYXNlKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKGRhdGFiYXNlLCB1c2VyTmFtZSwgbmFtZXMpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogU2VlIGNvbW1lbnQgYXQKLQkgKiB7QGxpbmsgI2FkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlLCBTdHJpbmcsIEFycmF5TGlzdCl9LgotCSAqLwotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIHRoZSB1c2VyIG5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhkYXRhYmFzZSwgdXNlck5hbWUsIG5hbWVzKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIG5hbWUgcGFzc2VkIGluIGhlcmUgd2FzIHJldHJpZXZlZCBmcm9tIERUUC4KLQkgKiBEVFAgc3RvcmVzIHRoZSB1c2VyIG5hbWUgdGhhdCB3YXMgcGFzc2VkIHRvIGl0IGR1cmluZyB0aGUgY29ubmVjdGlvbgotCSAqIHRvIHRoZSBkYXRhYmFzZS4gQXMgYSByZXN1bHQsIHRoaXMgdXNlciBuYW1lIGlzIGFuIDxlbT5pZGVudGlmaWVyPC9lbT4KLQkgKiBub3QgYSA8ZW0+bmFtZTwvZW0+LgotCSAqIElmIHRoZSB1c2VyIG5hbWUgd2VyZSByZXRyaWV2ZWQgZnJvbSB0aGUgSkRCQyBjb25uZWN0aW9uIGl0IHdvdWxkIHByb2JhYmx5Ci0JICogYmUgYSA8ZW0+bmFtZTwvZW0+LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25uZWN0IHRvIGFuIE9yYWNsZSBkYXRhYmFzZSB3aXRoIHRoZQotCSAqIHVzZXIgbmFtZSAic2NvdHQiLCBidXQgdGhhdCBpZGVudGlmZXIgaXMgZm9sZGVkIHRvIHRoZSBhY3R1YWwgdXNlciBuYW1lCi0JICogIlNDT1RUIi4gRFRQIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyaW5nICJzY290dCIsIHdoaWxlIHRoZSBPcmFjbGUgSkRCQwotCSAqIGRyaXZlciBzdG9yZXMgdGhlIGZvbGRlZCBzdHJpbmcgIlNDT1RUIi4KLQkgKi8KLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmb2xkaW5nIHN0cmF0ZWd5IHVzZWQgdG8gY29udmVydCBuYW1lcyBhbmQgaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIFNRTCBzcGVjIHNheXMgYSA8ZW0+cmVndWxhcjwvZW0+IChub24tZGVsaW1pdGVkKSBpZGVudGlmaWVyIHNob3VsZCBiZQotCSAqIGZvbGRlZCB0byB1cHBlcmNhc2U7IGJ1dCBzb21lIGRhdGFiYXNlcyBkbyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KLQkgKi8KLQlhYnN0cmFjdCBGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAtPiBpZGVudGlmaWVyICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVxdWlyZXNEZWxpbWl0ZXJzKG5hbWUpID8KLQkJCQkJCXRoaXMuZGVsaW1pdE5hbWUobmFtZSkgOgotCQkJCQkJdGhpcy5yZWd1bGFyTmFtZXNNYXRjaChuYW1lLCBkZWZhdWx0TmFtZSkgPyBudWxsIDogbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVSZXF1aXJlc0RlbGltaXRlcnMobmFtZSkgPyB0aGlzLmRlbGltaXROYW1lKG5hbWUpIDogbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIG11c3QgYmUgZGVsaW1pdGVkCi0JICogd2hlbiB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQuCi0JICogSWYgdGhlIG5hbWUgaGFzIGFueSAic3BlY2lhbCIgY2hhcmFjdGVycyAoYXMgb3Bwb3NlZCB0byBsZXR0ZXJzLAotCSAqIGRpZ2l0cywgYW5kIG90aGVyIGFsbG93ZWQgY2hhcmFjdGVycyBbZS5nLiB1bmRlcnNjb3Jlc10pLCBpdCByZXF1aXJlcwotCSAqIGRlbGltaXRlcnMuCi0JICogSWYgdGhlIG5hbWUgaXMgbWl4ZWQgY2FzZSBhbmQgdGhlIGRhdGFiYXNlIGZvbGRzIHVuZGVsaW1pdGVkIG5hbWVzCi0JICogKHRvIGVpdGhlciB1cHBlcmNhc2Ugb3IgbG93ZXJjYXNlKSwgaXQgcmVxdWlyZXMgZGVsaW1pdGVycy4KLQkgKi8KLQlib29sZWFuIG5hbWVSZXF1aXJlc0RlbGltaXRlcnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChuYW1lLmxlbmd0aCgpID09IDApICAvLyAgYW4gZW1wdHkgc3RyaW5nIG11c3QgYmUgZGVsaW1pdGVkKD8pCi0JCQkJCXx8IHRoaXMubmFtZUNvbnRhaW5zQW55U3BlY2lhbENoYXJhY3RlcnMobmFtZSkKLQkJCQkJfHwgdGhpcy5uYW1lSXNOb3RGb2xkZWQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFueSAic3BlY2lhbCIgY2hhcmFjdGVycwotCSAqIHRoYXQgcmVxdWlyZSB0aGUgbmFtZSB0byBiZSBkZWxpbWl0ZWQuCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBlbXB0eQotCSAqLwotCWJvb2xlYW4gbmFtZUNvbnRhaW5zQW55U3BlY2lhbENoYXJhY3RlcnMoU3RyaW5nIG5hbWUpIHsKLQkJY2hhcltdIHN0cmluZyA9IG5hbWUudG9DaGFyQXJyYXkoKTsKLQkJaWYgKHRoaXMuY2hhcmFjdGVySXNOb25SZWd1bGFyTmFtZVN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIG5vdGU6IHN0b3AgYXQgMQotCQkJaWYgKHRoaXMuY2hhcmFjdGVySXNOb25SZWd1bGFyTmFtZVBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyAibm9uLXJlZ3VsYXIiIGZvciB0aGUgZmlyc3QKLQkgKiBjaGFyYWN0ZXIgb2YgYSBuYW1lLgotCSAqIFR5cGljYWxseSwgZGF0YWJhc2VzIGFyZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgY2hhcmFjdGVycyBjYW4KLQkgKiBiZSB1c2VkIHRvIDxlbT5zdGFydDwvZW0+IGFuIGlkZW50aWZpZXIgKGFzIG9wcG9zZWQgdG8gdGhlIGNoYXJhY3RlcnMKLQkgKiBhbGxvd2VkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBpZGVudGlmaWVyKS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgPGVtPnJlZ3VsYXI8L2VtPiBmb3IgdGhlIGZpcnN0Ci0JICogY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFuIGlkZW50aWZpZXIgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHN0YXJ0IGNoYXJhY3RlcnMKLQkgKiA8L3VsPgotCSAqLwotCWJvb2xlYW4gY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQkvLyBhbGwgdmVuZG9ycyBhbGxvdyBhIGxldHRlcgotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyKGMpCi0JCQkJfHwgdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjKTsKLQl9Ci0KLQlib29sZWFuIGNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gYXJyYXlDb250YWlucyh0aGlzLmdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzLCBmb3IgdGhlCi0JICogZmlyc3QgY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBhcmUgbm8gImV4dGVuZGVkIiBjaGFyYWN0ZXJzLgotCSAqLwotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyAibm9uLXJlZ3VsYXIiIGZvciB0aGUgc2Vjb25kCi0JICogYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIG5hbWUuCi0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lUGFydChjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyA8ZW0+cmVndWxhcjwvZW0+IGZvciB0aGUgc2Vjb25kIGFuZAotCSAqIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIG5hbWUuCi0JICogVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgPGVtPnJlZ3VsYXI8L2VtPiBuYW1lIGNhbiBiZTo8dWw+Ci0JICogPGxpPmEgbGV0dGVyCi0JICogPGxpPmEgZGlnaXQKLQkgKiA8bGk+YW4gdW5kZXJzY29yZQotCSAqIDxsaT5hbnkgb2YgdGhlIGV4dGVuZGVkLCB2ZW5kb3Itc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gc3RhcnQgY2hhcmFjdGVycwotCSAqIDxsaT5hbnkgb2YgdGhlIGV4dGVuZGVkLCB2ZW5kb3Itc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gcGFydCBjaGFyYWN0ZXJzCi0JICogPC91bD4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQkvLyBhbGwgdmVuZG9ycyBhbGxvdyBhIGxldHRlciBvciBkaWdpdAotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fAotCQkJCShjID09ICdfJykgfHwKLQkJCQl0aGlzLmNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0KGMpIHx8Ci0JCQkJdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVQYXJ0KGMpOwotCX0KLQotCWJvb2xlYW4gY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIGFycmF5Q29udGFpbnModGhpcy5nZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzIGFuZCBkaWdpdHMgYW5kIHRoZQotCSAqIDxlbT5yZWd1bGFyPC9lbT4gZmlyc3QgY2hhcmFjdGVycywgZm9yIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycwotCSAqIG9mIGFuIGlkZW50aWZpZXIuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbCBjaGFyYWN0ZXJzLgotCSAqLwotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm9sZGVkIHRvIHRoZSBkYXRhYmFzZSdzCi0JICogY2FzZSwgcmVxdWlyaW5nIGl0IHRvIGJlIGRlbGltaXRlZC4KLQkgKi8KLQlib29sZWFuIG5hbWVJc05vdEZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLm5hbWVJc0ZvbGRlZChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIDxlbT5yZWd1bGFyPC9lbT4gbmFtZXMgbWF0Y2guCi0JICovCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gdGhpcy5yZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgPwotCQkJCQkJbmFtZTEuZXF1YWxzKG5hbWUyKSA6Ci0JCQkJCQluYW1lMS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIDxlbT5yZWd1bGFyPC9lbT4gaWRlbnRpZmllcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0JICovCi0JYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb2xkaW5nU3RyYXRlZ3koKS5yZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gZGVsaW1pdGVycyAodHlwaWNhbGx5IGRvdWJsZS1xdW90ZXMpLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVyIC0+IG5hbWUgKioqKioqKioqKgotCi0JLy8gbm90IHN1cmUgaG93IHRvIGhhbmRsZSBhbiBlbXB0eSBzdHJpbmc6Ci0JLy8gYm90aCAiIiBhbmQgIlwiXCIiIGFyZSBjb252ZXJ0ZWQgdG8gIiIgLi4uCi0JLy8gY29udmVydCAiIiB0byAnbnVsbCcgc2luY2UgZW1wdHkgc3RyaW5ncyBtdXN0IGJlIGRlbGltaXRlZD8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiAoaWRlbnRpZmllciA9PSBudWxsKSA/Ci0JCQkJCW51bGwgOgotCQkJCQl0aGlzLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKSA/Ci0JCQkJCQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0KGlkZW50aWZpZXIpIDoKLQkJCQkJCQl0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLmZvbGQoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGlzIDxlbT5kZWxpbWl0ZWQ8L2VtPi4KLQkgKiBUaGUgU1FMLTkyIHNwZWMgc2F5cyBpZGVudGlmaWVycyBzaG91bGQgYmUgZGVsaW1pdGVkIGJ5Ci0JICogZG91YmxlLXF1b3RlczsgYnV0IHNvbWUgZGF0YWJhc2VzIGFsbG93IG90aGVyd2lzZSAoZS5nLiBTeWJhc2UpLgotCSAqLwotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChpZGVudGlmaWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBWZW5kb3JOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZCAtIGFycmF5IG51bGwgY2hlY2sKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhcnJheUNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciBjKSB7Ci0JCXJldHVybiAoYXJyYXkgIT0gbnVsbCkgJiYgQXJyYXlUb29scy5jb250YWlucyhhcnJheSwgYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljN2E0YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBIYW5kbGUgdGhlIHZhcmlldHkgb2YgY2F0YWxvZyAoYW5kIHNjaGVtYSkgY29uZmlndXJhdGlvbnMgZ2VuZXJhdGVkIGJ5IERUUC4KLSAqLwotaW50ZXJmYWNlIENhdGFsb2dTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgRFRQIGRhdGFiYXNlIGhhcyByZWFsIGNhdGFsb2dzLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqLwotCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBzY2hlbWFzLgotCSAqLwotCUxpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RCMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RCMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI1NDA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EQjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgREIyCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGR0cFZlbmRvck5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgVURCID0gbmV3IERCMigiREIyIFVEQiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIFVEQl9JX1NFUklFUyA9IG5ldyBEQjIoIkRCMiBVREIgaVNlcmllcyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIFVEQl9aX1NFUklFUyA9IG5ldyBEQjIoIkRCMiBVREIgelNlcmllcyIpOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgVmVuZG9yIHVkYigpIHsKLQkJcmV0dXJuIFVEQjsKLQl9Ci0KLQlzdGF0aWMgVmVuZG9yIHVkYklTZXJpZXMoKSB7Ci0JCXJldHVybiBVREJfSV9TRVJJRVM7Ci0JfQotCi0Jc3RhdGljIFZlbmRvciB1ZGJaU2VyaWVzKCkgewotCQlyZXR1cm4gVURCX1pfU0VSSUVTOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBvbmx5IHN0YXRpYyBpbnN0YW5jZXMuCi0JICovCi0JcHJpdmF0ZSBEQjIoU3RyaW5nIGR0cFZlbmRvck5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBWZW5kb3JOYW1lID0gZHRwVmVuZG9yTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFZlbmRvck5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsgIC8vIG5vdCB2ZXJpZmllZCB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRGVyYnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EZXJieS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk0Y2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EZXJieS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgRGVyYnkKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IERlcmJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlcmJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gRmF1eENhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYU5hbWUodXNlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB1c2VyIG5hbWUgb24gRGVyYnkgaXMgIkFQUCIgd2hlbiB0aGUgdXNlciBjb25uZWN0cyB3aXRob3V0Ci0JICogYSB1c2VyIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLQkJcmV0dXJuICgodXNlck5hbWUgIT0gbnVsbCkgJiYgKHVzZXJOYW1lLmxlbmd0aCgpICE9IDApKSA/Ci0JCQkJdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkgOgotCQkJCURFRkFVTFRfVVNFUl9OQU1FOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSX05BTUUgPSAiQVBQIjsgIC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YjViNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIERUUCBkYXRhYmFzZXMgdGhhdCBidWlsZCBhICJ2aXJ0dWFsIiBjYXRhbG9nICh0aGF0IGhhcwotICogbm8gbmFtZSkgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciBkb2VzIG5vdCByZXR1cm4gYW55IGNhdGFsb2dzCi0gKiAoZS5nLiBPcmFjbGUpLgotICogQHNlZSBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCkKLSAqLwotY2xhc3MgRmF1eENhdGFsb2dTdHJhdGVneQotCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IEZhdXhDYXRhbG9nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBDYXRhbG9nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRmF1eENhdGFsb2dTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0aGlzLmdldEZhdXhDYXRhbG9nKGRhdGFiYXNlLmdldENhdGFsb2dzKCkpLmdldFNjaGVtYXMoKTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2cgZ2V0RmF1eENhdGFsb2coTGlzdDxDYXRhbG9nPiBjYXRhbG9ncykgewotCQlpZiAoY2F0YWxvZ3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChjYXRhbG9ncy5zaXplKCkgIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGEgc2luZ2xlIGNhdGFsb2c6ICIgKyBjYXRhbG9ncy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlDYXRhbG9nIGNhdGFsb2cgPSBjYXRhbG9ncy5nZXQoMCk7Ci0JCWlmIChjYXRhbG9nLmdldE5hbWUoKS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbGxlZ2FsIG5hbWU6ICIgKyBjYXRhbG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Gb2xkaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Gb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4MDI4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRm9sZGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLS8qKgotICogSGFuZGxlIGRhdGFiYXNlLXNwZWNpZmljIGlkZW50aWZpZXItZm9sZGluZyBpc3N1ZXMuCi0gKi8KLWludGVyZmFjZSBGb2xkaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogRm9sZCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JU3RyaW5nIGZvbGQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSBpcyBhbHJlYWR5IGZvbGRlZCwKLQkgKiBtZWFuaW5nLCBpZiBpdCBoYXMgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBpdCByZXF1aXJlcyBubyBkZWxpbWl0ZXJzLgotCSAqLwotCWJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkYXRhYmFzZSBpcyBjYXNlLXNlbnNpdGl2ZSB3aGVuIHVzaW5nICJyZWd1bGFyIgotCSAqIChpLmUuIG5vbi1kZWxpbWl0ZWQpIGlkZW50aWZpZXJzLgotCSAqLwotCWJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSFNRTERCLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSFNRTERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTAzOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0hTUUxEQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgSFNRTERCCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBIU1FMREIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSFNRTERCKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJIU1FMREIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsgIC8vIG5vdCB2ZXJpZmllZCB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoUFVCTElDX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ0hFTUFfTkFNRSA9ICJQVUJMSUMiOyAgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSW5mb3JtaXguamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9JbmZvcm1peC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRlMmE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9JbmZvcm1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1jbGFzcyBJbmZvcm1peAotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgSW5mb3JtaXgoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSW5mb3JtaXgoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gIkluZm9ybWl4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0xvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0xvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2UxOTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEZvbGQgIm5vcm1hbCIgaWRlbnRpZmllcnMgdG8gbG93ZXIgY2FzZS4KLSAqIElnbm9yZSB0aGUgY2FzZSBvZiAibm9ybWFsIiBpZGVudGlmaWVycy4KLSAqLwotY2xhc3MgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBGb2xkaW5nU3RyYXRlZ3kKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UobmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTWF4REIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNDU5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTWF4REIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgTWF4REIKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IE1heERCKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1heERCKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJNYXhEQiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVW5rbm93bkNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOyAgLy8gbm90IHZlcmlmaWVkIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyMnLCAnQCcsICckJyB9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTXlTUUwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9NeVNRTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBmZWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9NeVNRTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLWNsYXNzIE15U1FMCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBNeVNRTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBNeVNRTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTcWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIERUUCBtb2RlbCBmb3IgTXlTUUwgaGFzIGEgZGF0YWJhc2UgdGhhdCBjb250YWlucyBubyBjYXRhbG9nczsKLQkgKiBidXQsIGluc3RlYWQsIGRpcmVjdGx5IGhvbGRzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiB0aGUgZGF0YWJhc2UuIChUaGlzIGlzIGhhcmQtY29kZWQgaW4gTXlTcWxDYXRhbG9nRGF0YWJhc2UuZ2V0U2NoZW1hcygpLikKLQkgKiBBbHRob3VnaCB5b3UgY2FuIHF1YWxpZnkgaWRlbnRpZmllcnMgd2l0aCBhIGRhdGFiYXNlIG5hbWUKLQkgKiBpbiBNeVNRTCwgb25seSB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkIGF0IGxvZ2luIHNlZW1zIHRvIGJlIGF2YWlsYWJsZQotCSAqIGluIHRoZSBEVFAgbW9kZWwuLi4uCi0JICogCi0JICogTkI6IEluIE15U1FMIERETCwgU0NIRU1BIGlzIGEgc3lub255bSBmb3IgREFUQUJBU0U7IGJ1dCB0aGUgSkRCQwotCSAqIG1ldGhvZCBEYXRhYmFzZU1ldGFEYXRhLmdldFNjaGVtYXMoKSByZXR1cm5zIGFuIGVtcHR5IGxpc3QsCi0JICogd2hpbGUgZ2V0Q2F0YWxvZ3MoKSByZXR1cm5zIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGRhdGFiYXNlcy4KLQkgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBKREJDIG1ldGhvZCBDb25uZWN0aW9uLnNldENhdGFsb2coU3RyaW5nKSB0bwotCSAqIHNldCB0aGUgZGVmYXVsdCBkYXRhYmFzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBNeVNRTCBpcyBhIGJpdCB1bnVzdWFsLCBzbyB3ZSBmb3JjZSBleGFjdCBtYXRjaGVzLgotCSAqIChlLmcuIE15U1FMIGZvbGRzIGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcyB0byBsb3dlcmNhc2Ugb24gV2luZG93cwotCSAqIGJ5IGRlZmF1bHQ7IGJ1dCB0aGF0IGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlCi0JICogJ2xvd2VyX2Nhc2VfdGFibGVfbmFtZXMnIHN5c3RlbSB2YXJpYWJsZS4gVGhpcyBpcyBiZWNhdXNlIGRhdGFiYXNlcyBhcmUKLQkgKiBzdG9yZWQgYXMgZGlyZWN0b3JpZXMgYW5kIHRhYmxlcyBhcmUgc3RvcmVkIGFzIGZpbGVzIGluIHRoZSB1bmRlcmx5aW5nCi0JICogTy9TOyBhbmQgdGhlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGhlIG5hbWVzIGlzIGRldGVybWluZWQgYnkgdGhlIGJlaGF2aW9yCi0JICogb2YgZmlsZW5hbWVzIG9uIHRoZSBPL1MuIFRoZW4sIHRvIGNvbXBsaWNhdGUgdGhpbmdzLAotCSAqIG5vbmUgb2YgdGhlIG90aGVyIGlkZW50aWZpZXJzLCBsaWtlIGluZGV4IGFuZCBjb2x1bW4gbmFtZXMsIGFyZSBmb2xkZWQ7Ci0JICogYnV0IHRoZXkgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHVubGVzcyBkZWxpbWl0ZWQuIFNlZQotCSAqIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL2lkZW50aWZpZXItY2FzZS1zZW5zaXRpdml0eS5odG1sLikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBNeVNRTCBpcyB0aGUgb25seSB2ZW5kb3IgdGhhdCBhbGxvd3MgYSBkaWdpdC4KLQkgKiBBbHRob3VnaCwgdGhlIG5hbWUgY2Fubm5vdCBiZSAqYWxsKiBkaWdpdHMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNEaWdpdChjKSB8fCBzdXBlci5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJywgJyQnIH07Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBNeVNRTCBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJhY2t0aWNrcyAoYCk7IGJ1dCBpdAotCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKGlkZW50aWZpZXIsIEJBQ0tUSUNLKQotCQkJCQl8fCBzdXBlci5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1RJQ0sgPSAnYCc7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob0NhdGFsb2dTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmI3OWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgZG8gbm90IGhhdmUgY2F0YWxvZ3MKLSAqIChlLmcuIE15U1FMIHNlZSBidWcgMjQ5MDEzKS4KLSAqLwotY2xhc3MgTm9DYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb0NhdGFsb2dTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOb0NhdGFsb2dTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBkYXRhYmFzZS5nZXRTY2hlbWFzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9uRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9uRm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDNkMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi0KLS8qKgotICogRG8gbm90IGZvbGQgIm5vcm1hbCIgaWRlbnRpZmllcnMuCi0gKiBSZXNwZWN0IHRoZSBjYXNlIG9mICJub3JtYWwiIGlkZW50aWZpZXJzLgotICovCi1jbGFzcyBOb25Gb2xkaW5nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIEZvbGRpbmdTdHJhdGVneQotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IE5vbkZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOb25Gb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2UgaWRlbnRpZmllcnMgYXJlIG5vdCBmb2xkZWQgdG8gdXBwZXItIG9yIGxvd2VyLWNhc2UsIHRoZSBuYW1lIGlzCi0JICogYWxyZWFkeSAiZm9sZGVkIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvbGQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2luY2UgaWRlbnRpZmllcnMgYXJlIG5vdCBmb2xkZWQgdG8gdXBwZXItIG9yIGxvd2VyLWNhc2UsIHRoZSBuYW1lIGlzCi0JICogYWxyZWFkeSAiZm9sZGVkIi4KLQkgKiAoTm9uLWZvbGRpbmcgZGF0YWJhc2VzIGRvIG5vdCByZXF1aXJlIGRlbGltaXRlcnMgYXJvdW5kIG1peGVkLWNhc2UKLQkgKiAibm9ybWFsIiBpZGVudGlmaWVycy4pCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ3VsYXJJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2FkN2E5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9PcmFjbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgT3JhY2xlCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBPcmFjbGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JhY2xlKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEZhdXhDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJywgJyMnIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Qb3N0Z3JlU1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvUG9zdGdyZVNRTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTVmNWNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Qb3N0Z3JlU1FMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotCi1jbGFzcyBQb3N0Z3JlU1FMCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBQb3N0Z3JlU1FMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFBvc3RncmVTUUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gInBvc3RncmVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBQb3N0Z3JlU1FMIEpEQkMgZHJpdmVyIHJldHVybnMgYSBzaW5nbGUgY2F0YWxvZyBmcm9tIHRoZSBjYWxsIHRvCi0JICogRGF0YWJhc2VNZXRhRGF0YS5nZXRDYXRhbG9ncygpIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0JICogZGF0YWJhc2UgaW5pdGlhbGx5IHNwZWNpZmllZCBieSB0aGUgY29ubmVjdGlvbiAoaW4gdGhlIEpEQkMgVVJMKS4KLQkgKiBEVFAgdXNlcyB0aGlzIGNvbmZpZ3VyYXRpb24gdW5tb2RpZmllZC4gVW5mb3J0dW5hdGVseSwgdGhlIERUUAotCSAqIGRhdGFiYXNlJ3MgbmFtZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIFBvc3RncmVTUUwgZGF0YWJhc2UncwotCSAqIG5hbWUuCi0JICovCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFNpbXBsZUNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgUG9zdGdyZVNRTCBkYXRhYmFzZSBob2xkcyBhIHNpbmdsZSBjYXRhbG9nIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiB0aGUgZGF0YWJhc2UuCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoZGF0YWJhc2UpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nTmFtZShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gKChDYXRhbG9nKSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpLmdldCgwKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFBvc3RncmVTUUwgaGFzIGEgInNjaGVtYSBzZWFyY2ggcGF0aCIuIFRoZSBkZWZhdWx0IGlzOgotCSAqICAgICAiJHVzZXIiLHB1YmxpYwotCSAqIElmIHRoZSAiJHVzZXIiIHNjaGVtYSBpcyBub3QgZm91bmQsIHVzZSB0aGUgInB1YmxpYyIgc2NoZW1hLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIuYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oZGF0YWJhc2UsIHVzZXJOYW1lLCBuYW1lcyk7Ci0JCW5hbWVzLmFkZChQVUJMSUNfU0NIRU1BX05BTUUpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX1NDSEVNQV9OQU1FID0gInB1YmxpYyI7ICAvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TUUxTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TUUxTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjZWY1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU1FMU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1jbGFzcyBTUUxTZXJ2ZXIKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IFNRTFNlcnZlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTUUxTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gIlNRTCBTZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFNpbXBsZUNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFNRTCBTZXJ2ZXIgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKLQkgKiBkZWxpbWl0ZXJzLiBUaGlzIGNhbiBkZXBlbmQgb24gdGhlIGNvbGxhdGlvbiBzZXR0aW5nLi4uLgotCSAqLwotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBOb25Gb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTUUwgU2VydmVyIHdpbGwgdXNlIHRoZSB1c2VyLXJlcXVlc3RlZCBkYXRhYmFzZTsgaWYgdGhhdCBkYXRhYmFzZSBpcyBub3QKLQkgKiBmb3VuZCwgaXQgd2lsbCBkZWZhdWx0IHRvICdtYXN0ZXInLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChkYXRhYmFzZS5nZXROYW1lKCkpOwotCQluYW1lcy5hZGQoTUFTVEVSX0NBVEFMT0dfSURFTlRJRklFUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19JREVOVElGSUVSID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzY2hlbWEgb24gU1FMIFNlcnZlciBmb3IgYW55IGRhdGFiYXNlIChjYXRhbG9nKSBpcyAnZGJvJy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJywgJyMnIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBTUUwgU2VydmVyIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMgKFtdKTsgYnV0IGl0Ci0JICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NpbXBsZUNhdGFsb2dTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NpbXBsZUNhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTFhMDQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIERUUCBkYXRhYmFzZXMgdGhhdCBzaW1wbHkgbW9kZWwgdGhlIGNhdGFsb2dzIHJldHVybmVkCi0gKiBieSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciAoZS5nLiBTeWJhc2UpLgotICogQHNlZSBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCkKLSAqLwotY2xhc3MgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNpbXBsZUNhdGFsb2dTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCX0KLQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MGI5YjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1N5YmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLWNsYXNzIFN5YmFzZQotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkdHBWZW5kb3JOYW1lOwotCi0Jc3RhdGljIGZpbmFsIFZlbmRvciBBU0EgPSBuZXcgU3liYXNlKCJTeWJhc2VfQVNBIik7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgVmVuZG9yIEFTRSA9IG5ldyBTeWJhc2UoIlN5YmFzZV9BU0UiKTsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIFZlbmRvciBhc2EoKSB7Ci0JCXJldHVybiBBU0E7Ci0JfQotCi0Jc3RhdGljIFZlbmRvciBhc2UoKSB7Ci0JCXJldHVybiBBU0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG9ubHkgc3RhdGljIGluc3RhbmNlcy4KLQkgKi8KLQlwcml2YXRlIFN5YmFzZShTdHJpbmcgZHRwVmVuZG9yTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cFZlbmRvck5hbWUgPSBkdHBWZW5kb3JOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVmVuZG9yTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0Ci0JICogZGVsaW1pdGVycy4gVGhpcyBjYW4gZGVwZW5kIG9uIHRoZSBjb2xsYXRpb24gc2V0dGluZy4uLi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogU3liYXNlIHdpbGwgdXNlIHRoZSB1c2VyLXJlcXVlc3RlZCBkYXRhYmFzZTsgaWYgdGhhdCBkYXRhYmFzZSBpcyBub3QKLQkgKiBmb3VuZCwgaXQgd2lsbCBkZWZhdWx0IHRvICdtYXN0ZXInLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChkYXRhYmFzZS5nZXROYW1lKCkpOwotCQluYW1lcy5hZGQoTUFTVEVSX0NBVEFMT0dfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19OQU1FID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKLQkgKiAnZGJvJy4KLQkgKiAKLQkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgotCSAqIFRoZSBzZXJ2ZXIgbG9va3MgZm9yIGEgc2NoZW1hIG9iamVjdCAoZS5nLiBhIHRhYmxlKSBmaXJzdCBpbiB0aGUgdXNlcidzCi0JICogc2NoZW1hLCB0aGVuIGl0IGxvb2tzIGZvciB0aGUgc2NoZW1hIG9iamVjdCBpbiB0aGUgZGF0YWJhc2Ugb3duZXIncwotCSAqIHNjaGVtYSAoZGJvKS4gQXMgYSByZXN1bHQsIGl0J3MgcmVhbGx5IG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5Ci0JICogdGhlICJkZWZhdWx0IiBzY2hlbWEgd2l0aG91dCBrbm93aW5nIHRoZSBzY2hlbWEgb2JqZWN0IHdlIGFyZQotCSAqIGxvb2tpbmcgZm9yLgotCSAqIAotCSAqIChOb3RlOiB0aGUgY3VycmVudCAndXNlcicgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBjdXJyZW50Ci0JICogJ2xvZ2luJyAtIHNlZSBzcF9hZGR1c2VyIGFuZCBzcF9hZGRsb2dpbjsgc28gd2UgcHJvYmFibHkgY2FuJ3QKLQkgKiB1c2UgQ29ubmVjdGlvblByb2ZpbGUjZ2V0VXNlck5hbWUoKS4pCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICelJywgJ6MnLCAnIycgfTsKLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFN5YmFzZSBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJyYWNrZXRzIChbXSk7IGJ1dCBpdAotCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKGlkZW50aWZpZXIpCi0JCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVW5rbm93bkNhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlhNzI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciB1bmtub3duIERUUCBkYXRhYmFzZXMuCi0gKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQotICovCi1jbGFzcyBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXRGYXV4Q2F0YWxvZyhjYXRhbG9ncykgPT0gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQ2F0YWxvZyBmYXV4Q2F0YWxvZyA9IHRoaXMuZ2V0RmF1eENhdGFsb2coY2F0YWxvZ3MpOwotCQlyZXR1cm4gKGZhdXhDYXRhbG9nID09IG51bGwpID8gY2F0YWxvZ3MgOiBDb2xsZWN0aW9ucy48Q2F0YWxvZz5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCS8vIGlmIHRoZXJlIGFyZSBubyBjYXRhbG9ncywgdGhlIGRhdGFiYXNlIG11c3QgaG9sZCB0aGUgc2NoZW1hdGEgZGlyZWN0bHkKLQkJaWYgKChjYXRhbG9ncyA9PSBudWxsKSB8fCBjYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBkYXRhYmFzZS5nZXRTY2hlbWFzKCk7Ci0JCX0KLQotCQlDYXRhbG9nIGZhdXhDYXRhbG9nID0gdGhpcy5nZXRGYXV4Q2F0YWxvZyhjYXRhbG9ncyk7Ci0JCXJldHVybiAoZmF1eENhdGFsb2cgIT0gbnVsbCkgPyBmYXV4Q2F0YWxvZy5nZXRTY2hlbWFzKCkgOiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2cgZ2V0RmF1eENhdGFsb2coTGlzdDxDYXRhbG9nPiBjYXRhbG9ncykgewotCQlpZiAoY2F0YWxvZ3Muc2l6ZSgpID09IDEpIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKLQkJCWlmIChjYXRhbG9nLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3NTEyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVW5yZWNvZ25pemVkVmVuZG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFVucmVjb2duaXplZFZlbmRvcgotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgVW5yZWNvZ25pemVkVmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVucmVjb2duaXplZFZlbmRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiVW5yZWNvZ25pemVkIFZlbmRvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuLi4uCi0JICogQXNzdW1lIHRoZSBEVFAgZGF0YWJhc2UgaXMgb3JnYW5pemVkIGludG8gb25lIG9yIG1vcmUgY2F0YWxvZ3MgYW5kCi0JICogdGhlIHNjaGVtYXRhIGFyZSBjb250YWluZWQgYnkgdGhvc2UgY2F0YWxvZ3MuIFRoaXMgYXBwZWFycyB0byBiZSB0aGUKLQkgKiBkZWZhdWx0IHdheSBEVFAgYnVpbGRzIG1vZGVscyB0aGVzZSBkYXlzIChpLmUuIGEgZGF0YWJhc2Ugd2l0aCBhdAotCSAqIGxlYXN0IG9uZSBjYXRhbG9nLCBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBob2xkaW5nIHNjaGVtYXRhCi0JICogZGlyZWN0bHkpLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U4ODk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEZvbGQgIm5vcm1hbCIgaWRlbnRpZmllcnMgdG8gdXBwZXIgY2FzZS4KLSAqIElnbm9yZSB0aGUgY2FzZSBvZiAibm9ybWFsIiBpZGVudGlmaWVycy4KLSAqLwotY2xhc3MgVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBGb2xkaW5nU3RyYXRlZ3kKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2UobmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzdkYzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9WZW5kb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogRGVsZWdhdGUgdmVuZG9yLXNwZWNpZmljIGJlaGF2aW9yIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZTo8dWw+Ci0gKiAgIDxsaT5jYXRhbG9nIHN1cHBvcnQKLSAqICAgPGxpPmRlZmF1bHQgY2F0YWxvZyBhbmQgc2NoZW1hCi0gKiAgIDxsaT5jb252ZXJ0aW5nIG5hbWVzIHRvIGlkZW50aWZpZXJzIGFuZCB2aWNlLXZlcnNhCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz48YnI+Ci0gKiBXZSB1c2UgPGVtPm5hbWU8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgdW5tb2RpZmllZCBuYW1lIG9mIGEgZGF0YWJhc2Ugb2JqZWN0Ci0gKiBhcyBzdXBwbGllZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmIChpLmUuIGl0IGlzIG5vdCBkZWxpbWl0ZWQgYW5kIGl0IGlzIGFsd2F5cwotICogY2FzZS1zZW5zaXRpdmUpLgotICogPGJyPgotICogV2UgdXNlIDxlbT5pZGVudGlmaWVyPC9lbT4gd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlbmRvciB7Ci0KLQkvKioKLQkgKiBUaGlzIG11c3QgbWF0Y2ggdGhlIERUUCB2ZW5kb3IgbmFtZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSNnZXRWZW5kb3IoKQotCSAqLwotCVN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmVuZG9yIHN1cHBvcnRzICJyZWFsIiBjYXRhbG9ncyAoZS5nLiBTeWJhc2UpLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqLwotCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2cgbmFtZXMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCB1c2VyLiBUaGUgZmlyc3QgbmFtZSBpbiB0aGUgbGlzdCB0aGF0IGlkZW50aWZpZXMgYSBjYXRhbG9nCi0JICogdGhhdCBleGlzdHMgaXMgInRoZSIgZGVmYXVsdC4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIHNjaGVtYXMuCi0JICovCi0JTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSBuYW1lcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHVzZXIuIFRoZSBmaXJzdCBuYW1lIGluIHRoZSBsaXN0IHRoYXQgaWRlbnRpZmllcyBhIHNjaGVtYQotCSAqIHRoYXQgZXhpc3RzIGlzICJ0aGUiIGRlZmF1bHQuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0U2NoZW1hTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSB2ZW5kb3IgaWRlbnRpZmllci4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgbmFtZS4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSB2ZW5kb3IgaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBpZGVudGlmaWVyIHRvIGEgdmVuZG9yIG5hbWUuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvclJlcG9zaXRvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9WZW5kb3JSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGYwOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvclJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmVuZG9yUmVwb3NpdG9yeSB7Ci0JcHJpdmF0ZSBmaW5hbCBWZW5kb3JbXSB2ZW5kb3JzOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yUmVwb3NpdG9yeSBJTlNUQU5DRSA9IG5ldyBWZW5kb3JSZXBvc2l0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlbmRvclJlcG9zaXRvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVmVuZG9yUmVwb3NpdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52ZW5kb3JzID0gdGhpcy5idWlsZFZlbmRvcnMoKTsKLQl9Ci0KLQlwcml2YXRlIFZlbmRvcltdIGJ1aWxkVmVuZG9ycygpIHsKLQkJQXJyYXlMaXN0PFZlbmRvcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VmVuZG9yPigpOwotCQl0aGlzLmFkZFZlbmRvcnNUbyhsaXN0KTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgVmVuZG9yW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZlbmRvcnNUbyhBcnJheUxpc3Q8VmVuZG9yPiBsaXN0KSB7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oREIyLnVkYigpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhEQjIudWRiSVNlcmllcygpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhEQjIudWRiWlNlcmllcygpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhEZXJieS5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhIU1FMREIuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oSW5mb3JtaXguaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oTWF4REIuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oTXlTUUwuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oT3JhY2xlLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKFBvc3RncmVTUUwuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oU1FMU2VydmVyLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKFN5YmFzZS5hc2EoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oU3liYXNlLmFzZSgpLCBsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVmVuZG9yVG8oVmVuZG9yIHZlbmRvciwgQXJyYXlMaXN0PFZlbmRvcj4gbGlzdCkgewotCQlTdHJpbmcgbmFtZSA9IHZlbmRvci5nZXREVFBWZW5kb3JOYW1lKCk7Ci0JCWZvciAoSXRlcmF0b3I8VmVuZG9yPiBzdHJlYW0gPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZ2V0RFRQVmVuZG9yTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkR1cGxpY2F0ZSB2ZW5kb3I6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWxpc3QuYWRkKHZlbmRvcik7Ci0JfQotCi0JcHVibGljIFZlbmRvciBnZXRWZW5kb3IoU3RyaW5nIGR0cFZlbmRvck5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMudmVuZG9ycy5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlWZW5kb3IgdmVuZG9yID0gdGhpcy52ZW5kb3JzW2ldOwotCQkJaWYgKHZlbmRvci5nZXREVFBWZW5kb3JOYW1lKCkuZXF1YWxzKGR0cFZlbmRvck5hbWUpKSB7Ci0JCQkJcmV0dXJuIHZlbmRvcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW5yZWNvZ25pemVkVmVuZG9yLmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjcwZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZmMGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kb2MudXNlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmhlbHA7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTI0MzBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFib3V0IHRoaXMgY29udGVudDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWJvdXQgdGhpcyBjb250ZW50IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyOTAiIG5hbWU9InN0aHJlZjI5MCI+PC9hPgotPGgxPkFib3V0IHRoaXMgY29udGVudDwvaDE+Ci08cD5Ob3ZlbWJlciwgMjAwOTwvcD4KLTxhIGlkPSJzdGhyZWYyOTEiIG5hbWU9InN0aHJlZjI5MSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5MaWNlbnNlPC9wPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT4uIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+PC9jb2RlPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0xMS0xNlQ5OjU2OjIzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAzLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjkwIiBuYW1lPSJzdGhyZWYyOTAiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+Tm92ZW1iZXIsIDIwMDk8L3A+Ci08YSBpZD0ic3RocmVmMjkxIiBuYW1lPSJzdGhyZWYyOTEiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjODgwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgZGNvbW1vbi8sXAotICAgICAgICAgICAgICAgaW1nLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfbWFwcGluZy5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAxLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMi5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMS5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAyLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwNC5odG0sXAotICAgICAgICAgICAgICAgaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGxlZ2FsLmh0bSxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHJlZl9kZXRhaWxzX29ybS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2pwYV9mYWNldC5odG0sXAotICAgICAgICAgICAgICAgcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0sXAotICAgICAgICAgICAgICAgcmVmX25ld19qcGFfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3ByaW1hcnlfa2V5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDExLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2luaGVyaXRhbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIxLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMi5odG0sXAotICAgICAgICAgICAgICAgdGlwc19hbmRfdHJpY2tzLmh0bSxcCi0gICAgICAgICAgICAgICB0b2MueG1sLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldy5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAxLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMy5odG0sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNC5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2FkZF9jb252ZXJ0ZXIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qYXZhX3BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qb2luX2NvbHVtbnMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfc2VsZWN0VGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiOWQzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMsIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRvYy51c2VyL2RvYy9odG1sL2FzYzEyMjk3MDAzNDMzNTIuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBZb3VyIGVudmlyb25tZW50IG11c3QgYmUgc2V0IHVwIGJlZm9yZSB5b3UgY2FuIHBlcmZvcm0gdGhlIHN0ZXBzIGluIHRoaXMgY2hlYXQgc2hlZXQuIAotCi1DcmVhdGUgYSBkYXRhYmFzZSBwcm9maWxlIGFuZCBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLQotVGhlIERhdGFiYXNlIENvbm5lY3Rpb24gZGlhbG9nIGF1dG9tYXRpY2FsbHkgYXBwZWFycyB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGNvbW1hbmQgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLnNxbGVkaXRvci5hdHRhY2hQcm9maWxlQWN0aW9uIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi1TZWxlY3QgPGI+RmlsZS0mZ3Q7TmV3LSZndDtQcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0mZ3Q7SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiAKLQotT24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZCwgZW50ZXIgYSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCBzZWxlY3QgeW91ciB0YXJnZXQgcnVudGltZSwgYW5kIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uLgotCi1DbGljayA8Yj5OZXh0PC9iPiB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLQotVGhlICZxdW90O05ldyBKUEEgUHJvamVjdCZxdW90OyB3aXphcmQgaXMgYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk9wZW5Qcm9qZWN0V2l6YXJkQWN0aW9uIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UuamR0LnVpIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJTZWxlY3QgUHJvamVjdCBGYWNldCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIFByb2plY3QgRmFjZXQgcGFnZSB0byBzZWxlY3QgYSBwcmVkZWZpbmVkIHByb2plY3QgY29uZmlndXJhdGlvbiBvciBzcGVjaWZpYyBzcGVjaWZpYyBmYWNldHMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvamVjdC4gCi0KLUNsaWNrICZxdW90O05leHQmcXVvdDsgdG8gZGlzcGxheSB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNwZWNpZnkgdGhlIEpQQSBGYWNldCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBKUEEgRmFjZXQgcGFnZSB0byBzcGVjaWZ5IHRoZSB0aGUgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSwgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlLCBhbmQgdGhlIHNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LiAKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgaWYgRGFsaSBzaG91bGQgY3JlYXRlIGFuIG9ybS54bWwgZmlsZS4KLQotSWYgeW91IGRvIG5vdCBoYXZlIGFuIGFjdGl2ZSBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8Yj5BZGQgQ29ubmVjdGlvbnM8L2I+IHRvIGNyZWF0ZSBvbmUuIAotCi1JZiB5b3UgZG8gbm90IGhhdmUgYSBkZWZpbmVkIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBjbGljayA8Yj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvYj4gb3IgPGI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9iPiB0byBkZWZpbmUgb25lLiAKLQotQ2xpY2sgPGI+RmluaXNoPC9iPiB0byBjb21wbGV0ZSB0aGUgd2l6YXJkIGFuZCBvcGVuIHRoZSBvcGVuIHRoZSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJGaW5pc2giIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBKUEEgcHJvamVjdC4gQ29tcGxldGUgdGhlIGFkZGl0aW9uYWwgY2hlYXQgc2hlZXRzIHRvIGFkZCBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIG1hcCB0aG9zZSBlbnRpdGllcyB0byBkYXRhYmFzZSB0YWJsZXMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRlOGFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiPgotCTxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGFkZCBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8geW91ciBKYXZhIHByb2plY3QuIAotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlIDxiPkNsaWNrIHRvIEJlZ2luPC9iPiBidXR0b24gYmVsb3cuIAotTGV0J3MgZ2V0IHN0YXJ0ZWQhCi0gIDwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+Ci1UbyBjcmVhdGUgYSBQZXJzaXN0ZW50IGVudGl0eSwgeW91IG11c3QgY3JlYXRlIGEgSlBBIHByb2plY3QuIElmIHlvdSBhbHJlYWR5IGhhdmUgYSBKUEEgcHJvamVjdCwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4KLUlmIG5vdCwgc2VsZWN0IDxiPkZpbGUtPk5ldy0+UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtPkpQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gQ29tcGxldGUgZWFjaCBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIFByb2plY3Qgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJPcGVuIHRoZSBKUEEgRGV2ZWxvcG1lbnQgUGVyc3BlY3RpdmUiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSI+Ci0JCTxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBhcmFtMT0ib3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiLz4KLQkJPGRlc2NyaXB0aW9uPgotV2hlbiB3b3JraW5nIHdpdGggSlBBICBwZXJzaXN0ZW5jZSwgeW91IHNob3VsZCB1c2UgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlLiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICJDbGljayB0byBTa2lwIiBidXR0b24uIAotSWYgbm90LCBzZWxlY3QgPGI+V2luZG93LT5PcGVuIFBlcnNwZWN0aXZlLT5PdGhlcjwvYj4gaW4gdGhlIG1lbnViYXIgYXQgdGhlIHRvcCBvZiB0aGUgd29ya2JlbmNoLiBJbiB0aGUgU2VsZWN0IFBlcnNwZWN0aXZlcyBkaWFsb2csIHNlbGVjdCA8Yj5KUEEgRGV2ZWxvcG1lbnQ8L2I+IGFuZCBjbGljayBPSy4gVGhpcyBzdGVwIGNoYW5nZXMgdGhlIHBlcnNwZWN0aXZlIHRvIHNldCB1cCB0aGUgRWNsaXBzZSB3b3JrYmVuY2ggZm9yIEpQQSBkZXZlbG9wbWVudC4KLVlvdSBjYW4gY2xpY2sgdGhlICJDbGljayB0byBQZXJmb3JtIiBidXR0b24gdG8gaGF2ZSB0aGUgIlBlcnNpc3RlbmNlIiBwZXJzcGVjdGl2ZSBvcGVuZWQgYXV0b21hdGljYWxseS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKYXZhIENsYXNzIj4KLQkJPGRlc2NyaXB0aW9uPgotVGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgSmF2YSBjbGFzcy4gSW4gdGhlIG1haW4gdG9vbGJhciBhZ2FpbiwgY2xpY2sgb24gPGI+TmV3IEphdmEgQ2xhc3M8L2I+IGJ1dHRvbiAob3IgdGhlIGxpbmsgYmVsb3cpLgotVGhlIEphdmEgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIHNob3dpbmcgeW91ciBuZXcgY2xhc3MuICAgICAgCi0gICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj4KLUZpbmFsbHkgd2Ugd2lsbCBtYWtlIHRoZSBKYXZhIGNsYXNzIGEgcGVyc2lzdGVudCBlbnRpdHkuCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3IHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi1JbiB0aGUgSlBBIERldGFpbHMgdmlldywgdXNlIHRoZSAiTWFwIEFzIiBmaWVsZCB0byBzZWxlY3QgPGI+RW50aXR5PC9iPi4gRGFsaSBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIEBFbnRpdHkgYW5ub3RhdGlvbiB0byB0aGUgY2xhc3MgaW4gdGhlIEphdmEgZWRpdG9yLiAKLVVzZSB0aGUgVGFibGUsIENhdGFsb2csIGFuZCBTY2hlbWEgZmllbGRzIHRvIGFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBzcGVjaWZpYyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJGaW5pc2giPgotCQk8ZGVzY3JpcHRpb24+Ci1Db25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBhZGRlZCBhIEpQQSBlbnRpdHkgdG8geW91ciBKUEEgcHJvamVjdC4gQ29tcGxldGUgdGhlIGFkZGl0aW9uYWwgY2hlYXQgc2hlZXRzIHRvIG1hcCB0aGUgZW50aXR5J3MgZmllbGRzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjE5MTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJNYXAgYSBKYXZhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLSAgIDxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGF1dG9tYXRpY2FsbHkgbGF1bmNoIHdpemFyZHMsIHBlcmZvcm0gYWN0aW9ucywgYW5kIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyB0byBtYXAgdGhlIGZpZWxkcyBvZiBhIEpQQSBlbnRpdHkgZW50aXR5IHRvIHlvdXIgZGF0YWJhc2UuCi0KLVRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgY2hlYXQgc2hlZXRzIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQsIGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBCZWdpbiZxdW90OyBidXR0b24gYmVsb3cuIAotCi1MZXQmYXBvcztzIGdldCBzdGFydGVkIQotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaW50cm8+Ci0gICA8aXRlbSB0aXRsZT0iU2V0dXAgdGhlIEVudmlyb25tZW50IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kb2MudXNlci9kb2MvaHRtbC9hc2MxMjI5NzAwMzQzMzUyLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBtdXN0IGJlIHNldCB1cCBiZWZvcmUgeW91IGNhbiBwZXJmb3JtIHRoZSBzdGVwcyBpbiB0aGlzIGNoZWF0IHNoZWV0LiAKLQotQ3JlYXRlIGEgZGF0YWJhc2UgcHJvZmlsZSBhbmQgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgKGFuZCBhcmUgY29ubmVjdGVkIHRvKSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHlvdSAgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4KLQotVGhlIERhdGFiYXNlIENvbm5lY3Rpb24gZGlhbG9nIGF1dG9tYXRpY2FsbHkgYXBwZWFycyB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGNvbW1hbmQgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLnNxbGVkaXRvci5hdHRhY2hQcm9maWxlQWN0aW9uIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1Db21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuCi0KLVRoZSAmcXVvdDtOZXcgSlBBIFByb2plY3QmcXVvdDsgd2l6YXJkIGlzIGF1dG9tYXRpY2FsbHkgZGlzcGxheWVkIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLQotSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFdoZW4gd29ya2luZyB3aXRoIEpQQSAgcGVyc2lzdGVuY2UsIHlvdSBzaG91bGQgdXNlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUgYWN0aXZlLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctJmd0O09wZW4gUGVyc3BlY3RpdmUtJmd0O090aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24gdG8gaGF2ZSB0aGUgJnF1b3Q7UGVyc2lzdGVuY2UmcXVvdDsgcGVyc3BlY3RpdmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSmF2YSBDbGFzcyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgSmF2YSBjbGFzcy4gSW4gdGhlIG1haW4gdG9vbGJhciBhZ2FpbiwgY2xpY2sgb24gPGI+TmV3IEphdmEgQ2xhc3M8L2I+IGJ1dHRvbiAob3IgdGhlIGxpbmsgYmVsb3cpLgotVGhlIEphdmEgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIHNob3dpbmcgeW91ciBuZXcgY2xhc3MuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBGaW5hbGx5IHdlIHdpbGwgbWFrZSB0aGUgSmF2YSBjbGFzcyBhIHBlcnNpc3RlbnQgZW50aXR5LgotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotSW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHVzZSB0aGUgJnF1b3Q7TWFwIEFzJnF1b3Q7IGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQWRkIEZpZWxkcyB0byB0aGUgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSB3aWxsIGFkZCBzb21lIGZpZWxkcyB0byB0aGUgZW50aXR5IHRvIG1hcCB0byByb3dzIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gICAKLQotSWYgeW91ciBwZXJzaXN0ZW50IGVudGl0eSBhbHJlYWR5IGhhcyBmaWVsZHMgdG8gbWFwLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gSWYgbm90LCB1c2UgdGhlIEphdmEgZWRpdG9yIHRvIGFkZCBmaWVsZHMgdG8gdGhlIGVudGl0eS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5kYWxpLnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIHRoZSBNYXBwaW5nIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhbGkuZG9jLnVzZXIvcmVmX2VudGl0eV9wYWdlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBOb3cgeW91IGFyZSByZWFkeSB0byBtYXAgdGhlIGVudGl0eSBmaWVsZHMgdG8gY29sdW1ucyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIEluIHRoZSBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LCBleHBhbmQgdGhlIHBlcnNpc3RlbnQgZW50aXR5IHRvIGRpc3BsYXkgdGhlIGZpZWxkcy4gU2VsZWN0IGEgZmllbGQuIAotCi1UaGUgSlBBIERldGFpbHMgdmlldyBkaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZC4gVXNlIHRoZSBNYXAgQXMgZmllbGQgdG8gc2VsZWN0IHRoZSBCYXNpYyBtYXBwaW5nLiBVc2UgdGhlIENvbHVtbiBmaWVsZCB0byBzZWxlY3QgYSBjb2x1bW4gZnJvbSB0aGUgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgbWFwcGVkIHRoZSBmaWVsZHMgZnJvbSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBjb2x1bW4gaW4gYSBkYXRhYmFzZSB0YWJsZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MThiNTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkRKRkkiIG5hbWU9IkJBQkJESkZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxIiBuYW1lPSJzdGhyZWYyMSI+PC9hPjxhIGlkPSJzdGhyZWYyMiIgbmFtZT0ic3RocmVmMjIiPjwvYT5UaGUgRGFsaSBPUiAob2JqZWN0LXJlbGF0aW9uYWwpIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIGhvdyB5b3VyIGVudGl0eSBvYmplY3RzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1hcDwvc3Bhbj4gdG8gdGhlIGRhdGEgc291cmNlIChvciBvdGhlciBvYmplY3RzKS4gVGhpcyBhcHByb2FjaCBpc29sYXRlcyBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgbW9kZWwmbmRhc2g7ZGV2ZWxvcGVycyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgb2JqZWN0IG1vZGVsLCBhbmQgREJBcyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgc2NoZW1hLjwvcD4KLTxwPlRoZXNlIG1hcHBpbmdzIHRyYW5zZm9ybSBhbiBvYmplY3QgZGF0YSBtZW1iZXIgdHlwZSB0byBhIGNvcnJlc3BvbmRpbmcgcmVsYXRpb25hbCBkYXRhYmFzZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbi4gVGhlc2UgT1IgbWFwcGluZ3MgY2FuIGFsc28gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgc3RvcmVkIGluIG90aGVyIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UgYW5kIGFyZSByZWxhdGVkIHRocm91Z2ggZm9yZWlnbiBrZXlzLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoZXNlIG1hcHBpbmdzIHRvIG1hcCBzaW1wbGUgZGF0YSB0eXBlcyBpbmNsdWRpbmcgcHJpbWl0aXZlcyAoc3VjaCBhcyA8Y29kZT5pbnQ8L2NvZGU+KSwgSkRLIGNsYXNzZXMgKHN1Y2ggYXMgPGNvZGU+U3RyaW5nPC9jb2RlPiksIGFuZCBsYXJnZSBvYmplY3QgKExPQikgdmFsdWVzLiBZb3UgY2FuIGFsc28gdXNlIHRoZW0gdG8gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgYnkgd2F5IG9mIGFzc29jaWF0aW9uIHdoZXJlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9ucyByZXF1aXJlIG9iamVjdCBpZGVudGl0eSBtYWludGVuYW5jZSAoc3VjaCBhcyBzZXF1ZW5jaW5nIGFuZCBiYWNrIHJlZmVyZW5jZXMpIGFuZCBwb3NzZXNzIHZhcmlvdXMgdHlwZXMgb2YgbXVsdGlwbGljaXR5IGFuZCBuYXZpZ2FiaWxpdHkuIFRoZSBhcHByb3ByaWF0ZSBtYXBwaW5nIGNsYXNzIGlzIGNob3NlbiBwcmltYXJpbHkgYnkgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSByZWxhdGlvbnNoaXAuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTUzNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkNBSElDIiBuYW1lPSJCQUJDQUhJQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5IiBuYW1lPSJzdGhyZWYxOSI+PC9hPjxzcGFuIGNsYXNzPSJpdGFsaWMiPlBlcnNpc3RlbmNlPC9zcGFuPiByZWZlcnMgdG8gdGhlIGFiaWxpdHkgdG8gc3RvcmUgb2JqZWN0cyBpbiBhIGRhdGFiYXNlIGFuZCB1c2UgdGhvc2Ugb2JqZWN0cyB3aXRoIHRyYW5zYWN0aW9uYWwgaW50ZWdyaXR5LiBJbiBhIEoyRUUgYXBwbGljYXRpb24sIGRhdGEgaXMgdHlwaWNhbGx5IHN0b3JlZCBhbmQgcGVyc2lzdGVkIGluIHRoZSBkYXRhIHRpZXIsIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZS48L3A+Ci08cD48YSBpZD0ic3RocmVmMjAiIG5hbWU9InN0aHJlZjIwIj48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+RW50aXR5IGJlYW5zPC9zcGFuPiBhcmUgZW50ZXJwcmlzZSBiZWFucyB0aGF0IGNvbnRhaW4gcGVyc2lzdGVudCBkYXRhIGFuZCB0aGF0IGNhbiBiZSBzYXZlZCBpbiB2YXJpb3VzIHBlcnNpc3RlbnQgZGF0YSBzdG9yZXMuIFRoZSBlbnRpdHkgYmVhbnMgcmVwcmVzZW50IGRhdGEgZnJvbSBhIGRhdGFiYXNlOyBlYWNoIGVudGl0eSBiZWFuIGNhcnJpZXMgaXRzIG93biBpZGVudGl0eS4gRW50aXR5IGJlYW5zIGNhbiBiZSBkZXBsb3llZCB1c2luZyA8c3BhbiBjbGFzcz0iaXRhbGljIj5hcHBsaWNhdGlvbi1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iaXRhbGljIj5jb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZTwvc3Bhbj4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODA0OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBDb25jZXB0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4IiBuYW1lPSJzdGhyZWYxOCI+PC9hPjwvcD4KLTxoMT5Db25jZXB0czwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgY29uY2VwdHMgeW91IHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIHdoZW4gdXNpbmcgRGFsaSB0byBjcmVhdGUgbWFwcGluZ3MgZm9yIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkluIGFkZGl0aW9uIHRvIHRoZXNlIHNlY3Rpb25zLCB5b3Ugc2hvdWxkIHJldmlldyB0aGUgZm9sbG93aW5nIHJlc291cmNlcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIERhbGkgcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGk8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBwcm9qZWN0OiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+SlNSIDIyMCBFSkIgMy4wIHNwZWNpZmljYXRpb246IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMCI+aHR0cDovL3d3dy5qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjIwPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZUxpbmsgcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluayI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluazwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzE5ODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZDBiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhBR0lIIiBuYW1lPSJDSERIQUdJSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjIzIiBuYW1lPSJzdGhyZWYyMyI+PC9hPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvaDE+Ci08cD5UaGUgSlBBIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZiBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBmb3IgZGVwbG95bWVudC4gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRhdGFiYXNlIGFuZCBlbnRpdHkgbWFuYWdlciBvcHRpb25zLCBhbmQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBwZXJzaXN0ZW5jZSB1bml0LiBUbyBlbmFibGUgeW91IHRvIGVhc2lseSBlZGl0IHRoaXMgaW5mb3JtYXRpb24sIERhbGkgcHJvdmlkZXMgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgRWNsaXBzZSBYTUwgRWRpdG9yIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhpcyBpbmZvcm1hdGlvbi4gU2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVRvIHdvcmsgd2l0aCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cywgY29tbWVudCBvdXQgYWxsIGJ1dCBvbmUgcGVyc2lzdGVuY2UgdW5pdCBpbiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Y5ZWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERCSUpBQyIgbmFtZT0iQ0hEQklKQUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyNCIgbmFtZT0ic3RocmVmMjQiPjwvYT5UaGUgb3JtLnhtbCBmaWxlPC9oMT4KLTxwPkFsdGhvdWdoIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiBlbXBoYXNpemVzIHRoZSB1c2Ugb2YgYW5ub3RhdGlvbnMgdG8gc3BlY2lmeSBwZXJzaXN0ZW5jZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBzdG9yZSB0aGlzIG1ldGFkYXRhLiBEYWxpIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBhIHN0dWIgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgYSBKUEEgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uIFNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIG1ldGFkYXRhIG11c3QgbWF0Y2ggdGhlIFhTRCBzcGVjaWZpY2F0aW9uIG9mIHlvdXIgc2VsZWN0ZWQgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPHA+RGFsaSBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIFhNTCBtYXBwaW5nIGZpbGVzIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4gdGhhdCBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBhbm5vdGF0aW9uLWJhc2VkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIEphdmEgc291cmNlLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwYWIwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hY2Nlc3NUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoZSB2YXJpYWJsZSBpcyBhY2Nlc3NlZDogUHJvcGVydHkgKGRlZmF1bHQpIG9yIEZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZW50aXR5IG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV90YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgYXNzaWduZWQgdG8gdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgYSBwcm9wZXJ0eSBvciBmaWVsZCB0byBiZSBvdmVycmlkZGVuIChmcm9tIHRoZSBkZWZhdWx0IG1hcHBpbmdzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc05hbWUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBvdmVycmlkZXMgYSBwcm9wZXJ0eSBvciBmaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0luc2VydGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBJTlNFUlQgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc1VwZGF0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIFVQREFURSBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoaXMgYXR0cmlidXRlIG1hcHMgdG8gdGhlIGRhdGFiYXNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5UYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5JbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5VcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2ZldGNoVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZTogRWFnZXIgKGRlZmF1bHQpIG9yIExhenk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29wdGlvbmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkOiBBdXRvIChkZWZhdWx0KSwgU2VxdWVuY2UsIElkZW50aXR5LCBvciBUYWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFyZ2V0RW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2Nhc2NhZGVUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBlbnRpdHk6IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIG9yIE1vdmUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBwZWRCeSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pbkNvbHVtbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2UgZm9yIHRoZSBlbnRpdHkgYXNzb2NpYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luUmVmZXJlbmNlZENvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgIG1hcHBpbmcgb2YgYW4gZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgaXMgYmVpbmcgbWFwcGVkIHRvIHRoZSBlbnRpdHnigJlzIGF0dHJpYnV0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbWFwQXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBwZXJzaXN0ZW50IGRvbWFpbiBvYmplY3QgZm9yIHRoZSBKYXZhIGNsYXNzOiBQZXJzaXN0ZW50LCBFbWJlZGRlZCwgb3IgTWFwcGVkIFN1cGVyY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZVN0cmF0ZWd5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IGFuIGVudGl0eSBtYXkgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZW50aXRpZXM6IFNpbmdsZSB0YWJsZSwgT25lIHRhYmxlIHBlciBjbGFzcywgb3IgSm9pbmVkIHRhYmxlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aGVuIHVzaW5nIGEgU2luZ2xlIG9yIEpvaW5lZCBpbmhlcml0YW5jZSBzdHJhdGVneS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBmaWVsZCB0byBzZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBDSEFSIG9yIElOVEVHRVIgKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IFN0cmluZykuIFRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclZhbHVlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29yZGVyQnkiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIEVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlICBuYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIGZvcmVpZ24ga2V5IGZvciBhIG1hbnktdG8tbWFueSBvciBhIHVuaWRpcmVjdGlvbmFsIG9uZS10by1tYW55IGFzc29jaWF0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSB0aGUgam9pbiB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgY2F0YWxvZyBvciBzY2hlbWEsIGNvbmZpZ3VyZSBvbmUgb3IgbW9yZSBqb2luIHRhYmxlIGNvbHVtbnMgd2l0aCBhIHVuaXF1ZSBjb25zdHJhaW50LCBhbmQgdXNlIG11bHRpcGxlIGpvaW4gY29sdW1ucyBwZXIgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlSm9pbkNvbHVtbnMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSAgdHdvIG9yIG1vcmUgam9pbiBjb2x1bW5zICh0aGF0IGlzLCBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgam9pbiBjb2x1bW4gb24gdGhlIG93bmVkIChvciBpbnZlcnNlIHNpZGUpIG9mIHRoZSBhc3NvY2lhdGlvbjogdGhlIG93bmVkIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBKYXZhIFBlcnNpc3RlbmNlIG9wdGlvbnMgb24gdGhlIFByb3BlcnRpZXMgcGFnZSB0byBzZWxlY3QgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggdGhlIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlQ29ubmVjdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZVNjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEFkZCBQZXJzaXN0ZW5jZSBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZSB0byBzdG9yZSB0aGUgcGVyc2lzdGVuY2UgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlT3V0bGluZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgSlBBIFN0cnVjdHVyZSB2aWV3IGRpc3BsYXlzIGFuIG91dGxpbmUgb2YgdGhlIHN0cnVjdHVyZSAoaXRzIGF0dHJpYnV0ZXMgYW5kIG1hcHBpbmdzKSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIG9yIG9wZW5lZCBpbiB0aGUgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIFN0cnVjdHVyZSB2aWV3IiBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXMiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cgdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBiYXNlZCBvbiB5b3VyIGRhdGFiYXNlIHRhYmxlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgcHJvamVjdCBmb2xkZXIgbmFtZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBDbGljayBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIGZvbGRlci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19wYWNrYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwYWNrYWdlIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMsIG9yIGNsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc190YWJsZXMiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcyBhbmQgdG8gY3JlYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX25ld0pQQVByb2plY3QiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgbmV3IEpQQSBwcm9qZWN0IG5hbWUsIGl0cyBsb2NhdGlvbiwgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2RhdGFiYXNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGVzZSBmaWVsZHMgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfY2xhc3NwYXRoIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIG9wdGlvbiB0byBhZGQgbGlicmFyaWVzIG9yIEpBUnMgdGhhdCBjb250YWluIHRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBhbmQgZW50aXRpZXMgdG8gdGhlIHByb2plY3TigJlzIEphdmEgQnVpbGQgUGF0aC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9wYWNrYWdpbmciPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBTZWxlY3QgdGhlIHBlcnNpc3RlbmNlIHZlcnNpb24sIHRoZSBuYW1lIG9mIHRoZSBKUEEgcHJvdmlkZXIsIGFuZCBhIHVuaXF1ZSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb3B0aW9ucyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggc2NyaXB0IG9wdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT3B0aW9ucyBwYWdlICIgaHJlZj0icmVmX29wdGlvbnMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX29iamVjdHMgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBzY3JpcHQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik9iamVjdHMgcGFnZSAiIGhyZWY9InJlZl9vYmplY3RzLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zYXZlICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZmlsZW5hbWUgYW5kIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LiBZb3UgY2FuIGFsc28gcHJldmlldyB0aGUgc2NyaXB0IGFuZCBzcGVjaWZ5IHRvIHJ1biBvciBjb250aW51ZSBlZGl0aW5nIHRoZSBzY3JpcHQgYWZ0ZXIgZ2VuZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iU2F2ZSBhbmQgUnVuIERETCBwYWdlICIgaHJlZj0icmVmX3NhdmVfYW5kX3J1bi5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfc3VtbWFyeSAiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBwYWdlIHNob3dzIHRoZSBzZXR0aW5ncyB0aGF0IHlvdSBzZWxlY3RlZCBmb3IgdGhlIGdlbmVyYXRlZCBEREwuIFRvIGNoYW5nZSBhbnkgb3B0aW9uIGNsaWNrICJCYWNrIiBvciBjbGljayAiRmluaXNoIiB0byBjb250aW51ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiBUaGlzIG5hbWUgaXMgZ2xvYmFsIHRvIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IChhY3Jvc3MgYWxsIGdlbmVyYXRvciB0eXBlcykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gb2YgdGhlIGdlbmVyYXRvciB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JWYWx1ZUNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBmb3IgdGhlIGNvbHVtbiB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uVmFsdWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcHJpbWFyeSBrZXkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZGF0YWJhc2VBdXRob3JpemF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0byBjb25uZWN0IChsb2cgaW4pIHRvIGEgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB5b3VyIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gCi0JCVlvdSBtdXN0IGhhdmUgYSBkZWZpbmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gKGFuZCBiZSBjb25uZWN0ZWQpIHRvIGFkZCBwZXJzaXN0ZW5jZS4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgcGVyc2lzdGVuY2UgdG8gYSBKYXZhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlX3Byb2plY3QuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RlbXBvcmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIG1hcHBlZCBmaWVsZCBjb250YWlucyBhIERhdGUgKGphdmEuc3FsLkRhdGUpLCBUaW1lIChqYXZhLnNxbC5UaW1lKSwgb3IgVGltZXN0YW1wIChqYXZhLnNxbC5UaW1lc3RhbXApIHZhbHVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19wcmltYXJ5S2V5R2VuZXJhdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5EZWZpbmUgaG93IHRoZSBwcmltYXJ5IGtleSBpcyBnZW5lcmF0ZWQ8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gdXNlIGEgc3BlY2lmaWMgZGF0YWJhc2UgdGFibGUgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgc2VxdWVuY2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvclNlcXVlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2xvYiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIHRoZSBmaWVsZCBpcyBtYXBwZWQgdG8gamF2YS5zcWwuQ2xvYiBvciBqYXZhLnNxbC5CbG9iLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VudW1lcmF0ZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGlmIHRoZSBTdHJpbmcgdmFsdWUgc3VpdHMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgb3IgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSBUYWJsZS4gVGhpcyBmaWVsZCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIGluIHRoZSBvcm0ueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9zY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSBUYWJsZS4gVGhpcyBmaWVsZCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIGluIHRoZSBvcm0ueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9wYWNrYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcyB0byB3aGljaCB0aGUgb3JtLnhtbCBmaWxlIGFwcGxpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9zY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2NhdGFsb2ciPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdG8gdXNlIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgZW50aXRpZXMgbWFuYWdlZCBieSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9hY2Nlc3MiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdmFyaWFibGVzIGluIHRoaXMgcHJvamVjdDogUHJvcGVydHkgb3IgRmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9jYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPkFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1feG1sIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyB0aGF0IHRoZSBKYXZhIGNsYXNzZXMgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0IGFyZSBmdWxseSBzcGVjaWZpZWQgYnkgdGhlaXIgbWV0YWRhdGEuIEFueSBhbm5vdGF0aW9ucyB3aWxsIGJlIGlnbm9yZWQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19KUEFQbGF0Zm9ybSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLkRlZmF1bHQgaXMgR2VuZXJpYy4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19jcmVhdGVPUk0iPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGFuIGluaXRpYWwgb3JtLnhtbCBmaWxlLiBVc2UgdGhpcyBmaWxlIHRvIHNwZWNpZnkgcHJvamVjdCBhbmQgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0VHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGRlZmF1bHQgY2FjaGluZyBzdHJhdGVneSBmb3IgdGhlIHByb2plY3QuIFRoZSBkZWZhdWx0IGlzIFdlYWsgd2l0aCBTb2Z0IFN1YmNhY2hlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImNhY2hpbmdfZGVmYXVsdFNpemUiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIGNhY2hlLiBUaGUgZGVmYXVsdCBpcyAxMDAgaXRlbXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0U2hhcmVkIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgY2FjaGVkIGluc3RhbmNlcyBzaG91bGQgYmUgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBpbiBhIGNsaWVudCBpc29sYXRlZCBjYWNoZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJsb2dnaW5nX2xldmVsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyB0aGUgYW1vdW50IGFuZCBkZXRhaWwgb2YgbG9nIG91dHB1dCBieSBzZWxlY3RpbmcgdGhlIGxvZyBsZXZlbC4gRGVmYXVsdCBpcyBJbmZvIGxldmVsLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfdGltZVN0YW1wIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciB0aGUgdGltZXN0YW1wIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS4gRGVmYXVsdCBpcyBUcnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfdGhyZWFkIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciBhIHRocmVhZCBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS4gRGVmYXVsdCBpcyBUcnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfc2Vzc2lvbiI+Ci0JCTxkZXNjcmlwdGlvbj5Db250cm9sIHdoZXRoZXIgYW4gRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS4gRGVmYXVsdCBpcyBUcnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfZXhjZXB0aW9ucyI+Ci0JCTxkZXNjcmlwdGlvbj5Db250cm9sIHdoZXRoZXIgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBjb2RlIGFyZSBsb2dnZWQgcHJpb3IgdG8gcmV0dXJuaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEVuc3VyZXMgdGhhdCBhbGwgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkIGFuZCBub3QgbWFza2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb2RlLi4gRGVmYXVsdCBpcyBGYWxzZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcHRpb25zX3Nlc3Npb25OYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIG5hbWUgYnkgd2hpY2ggdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gaXMgc3RvcmVkIGluIHRoZSBzdGF0aWMgc2Vzc2lvbiBtYW5hZ2VyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfc2Vzc2lvbnNYbWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGZpbGUuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIGFzIGFuIGFsdGVybmF0aXZlIHRvIGFubm90YXRpb25zIGFuZCBkZXBsb3ltZW50IFhNTC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcHRpb25zX3RhcmdldERhdGFiYXNlIj4KLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfdGFyZ2V0U2VydmVyIj4KLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdEphdmEiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGluY2x1ZGUgZXhpc3RpbmcgSmF2YSBzb3VyY2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSmF2YSBwYWdlIiBocmVmPSJyZWZfamF2YV9wYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZCIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX25ld0pQQVByb2plY3RGYWNldCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB5b3VyIHZlbmRlci1zcGVjaWZpYyBwbGF0Zm9ybSwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnksIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZW50aXR5Q2xhc3NQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHBhY2thZ2UsIGNsYXNzIG5hbWUsIGFuZCBpbmhlcml0YW5jZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgdG8gY3JlYXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iRW50aXR5IENsYXNzIHBhZ2UiIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgRW50aXR5IHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIGVudGl0eSIgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZW50aXR5UHJvcGVydGllc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGVudGl0eSBuYW1lLCBhc3NvY2lhdGVkIHRhYmxlLCBhbmQgbWFwcGVkIGZpZWxkcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBFbnRpdHkgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgZW50aXR5IiBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19zZWxlY3RUYWJsZXNQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBkYXRhYmFzZSB0YWJsZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNlbGVjdCBUYWJsZXMgcGFnZSIgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfdGFibGVBc3NvY2lhdGlvbnNQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBjcmVhdGUgb3IgZWRpdCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZGF0YWJhc2UgdGFibGUgYW5kIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlRhYmxlIEFzc29jaWF0aW9ucyBwYWdlIiBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0YWJsZSBtYXBwaW5nIGFuZCBkb21haW4gY2xhc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24gcGFnZSIgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19jdXN0b21pemVJbmRpdmlkdWFsRW50aXRpZXMiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHRhYmxlIG1hcHBpbmcgYW5kIGRvbWFpbiBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyBwYWdlIiBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQotCTxjb250ZXh0IGlkPSJkaWFsb2dfYXNzb2NpYXRpb25UYWJsZXNQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBhc3NvY2lhdGlvbiB0YWJsZXMgZm9yIGFuIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9uIFRhYmxlcyBwYWdlIiBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfam9pbkNvbHVtbnNQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKb2luIENvbHVtbnMgcGFnZSIgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2Fzc29jaWF0aW9uQ2FyZGluYWxpdHlQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IGNhcmRpbmFsaXR5IG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb24gQ2FyZGluYWxpdHkgcGFnZSIgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfc2VsZWN0Q2FzY2FkZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgYXNzb2NpYXRpb246IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIFJlbW92ZSwgb3IgUmVmcmVzaC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNlbGVjdCBDYXNjYWRlIHBhZ2UiIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX2dlbmVyYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZ2VuZXJhbCBwZXJzaXN0ZW5jZSBvcHRpb25zLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhbCBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbCIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY29ubmVjdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkYXRhIHNvdXJjZSBvciBKREJDIGNvbm5lY3Rpb24gcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkNvbm5lY3Rpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2Nvbm5lY3Rpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX2N1c3RvbWl6YXRpb24iPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGVmYXVsdCBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY3VzdG9taXphdGlvbiBhbmQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ3VzdG9taXphdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY29ubmVjdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY2FjaGluZyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHNlc3Npb24gb3IgZW50aXR5IHNwZWNpZmljIEVjbGlwc2VMaW5rIGNhY2hpbmcgcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkNhY2hpbmcgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2NhY2hpbmciIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX2xvZ2dpbmciPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBsb2dnaW5nIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJMb2dnaW5nIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9sb2dnaW5nIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9vcHRpb25zIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBhbmQgbWlzY2VsbGFub3VzIG9wdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJPcHRpb25zIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vcHRpb25zIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9zY2hlbWFHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgc2NoZW1hIGdlbmVyYXRpb24gcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNjaGVtYSBHZW5lcmF0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9zY2hlbWFHZW5lcmF0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3BlcnRpZXMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9zb3VyY2UiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcGVydGllcyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBwYWdlIiBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19jcmVhdGVfbmV3X2NvbnZlcnRlcnMiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBhIG5ldyBFY2xpcHNlTGluayBjb252ZXRlci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBDb252ZXJ0ZXIgZGlhbG9nIiBocmVmPSJyZWZfYWRkX2NvbnZlcnRlciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0iIC8+Ci0JPC9jb250ZXh0PgotCi08IS0tIEFkZGVkIGZvciAzLjAgLS0+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfY2Fub25pY2FsTWV0YW1vZGVsIj4KLQkJPGRlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNjEyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AaW1wb3J0ICIuLi8uLi8uLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCwgc3Bhbi5ndWktb2JqZWN0LWFjdGlvbiwgcC5zdWJoZWFkMiwgc3Bhbi5ib2xkLCBwLm5vdGVwMSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUsIHAudGl0bGVpbmZpZ3VyZSwgc3Bhbi5pdGFsaWMgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXAudGl0bGVpbmZpZ3VyZSwgcC5zdWJoZWFkMiB7Ci0gIHBhZGRpbmctdG9wOiAxMHB4OwotfQotCi1zcGFuLmNvZGUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotfQotCi1zcGFuLmNvcHlyaWdodGxvZ28ge2ZvbnQtc2l6ZTogMC44ZW19Ci0KLS5mb290ZXIge21hcmdpbi10b3A6IDJlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjY2NjO3BhZGRpbmctdG9wOjFlbTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZWM0OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGhyZWY9Ii4uLy4uL2xlZ2FsLmh0bSI+TGljZW5zZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkwNGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZXR0aW5nIHN0YXJ0ZWQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBHZXR0aW5nIHN0YXJ0ZWQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyIiBuYW1lPSJzdGhyZWYyIj48L2E+PC9wPgotPGgxPkdldHRpbmcgc3RhcnRlZDwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBzdGFydGVkIHdpdGggdGhlIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNCQUJFRkhDRCI+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jQkFCSUdDSkEiPkRhbGkgcXVpY2sgc3RhcnQ8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IHRoZSBEYWxpIGhvbWUgcGFnZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvbWFpbi5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9tYWluLnBocDwvYT48L2NvZGU+LjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWNjZmY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFRkhDRCIgbmFtZT0iQkFCRUZIQ0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPGEgaWQ9InN0aHJlZjMiIG5hbWU9InN0aHJlZjMiPjwvYT48YSBpZD0ic3RocmVmNCIgbmFtZT0ic3RocmVmNCI+PC9hPjwvaDE+Ci08cD5CZWZvcmUgaW5zdGFsbGluZyBEYWxpLCBlbnN1cmUgdGhhdCB5b3VyIGVudmlyb25tZW50IG1lZXRzIHRoZSBmb2xsb3dpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWluaW11bTwvc3Bhbj4gcmVxdWlyZW1lbnRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkVjbGlwc2UgMy41ICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2FkcyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHM8L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+SmF2YSBSdW50aW1lIEVudmlyb25tZW50IChKUkUpIDEuNSAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL2phdmEuY29tIj5odHRwOi8vamF2YS5jb208L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgMy4xICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGZvciBKYXZhIEVFIDUuIEZvciBleGFtcGxlLCB0aGUgRWNsaXBzZUxpbmsgaW1wbGVtZW50YXRpb24gZm9yIEpQQSBjYW4gYmUgb2J0YWluZWQgZnJvbTogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWw8L2E+PC9jb2RlPiBmb3IgYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb24uPC9wPgotPHA+PGEgaWQ9InN0aHJlZjUiIG5hbWU9InN0aHJlZjUiPjwvYT5EYWxpIGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgV1RQIDMuMS4gTm8gYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC48L3A+Ci08YSBpZD0ic3RocmVmNiIgbmFtZT0ic3RocmVmNiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzPC9wPgotPHA+RGFsaSBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgYWNjZXNzaWJpbGl0eSBmZWF0dXJlcyBpbiBFY2xpcHNlLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYXZpZ2F0aW5nIHRoZSB1c2VyIGludGVyZmFjZSB1c2luZyB0aGUga2V5Ym9hcmQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNwZWNpZnlpbmcgZ2VuZXJhbCBhY2Nlc3NpYmlsaXR5IHByZWZlcmVuY2VzIGZvciB0aGUgZWRpdG9yLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2FjY2Vzc2liaWxpdHkvYWNjZXNzbWFpbi5odG0iPkFjY2Vzc2liaWxpdHkgRmVhdHVyZXMgaW4gRWNsaXBzZTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08YSBpZD0ic3RocmVmNyIgbmFtZT0ic3RocmVmNyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5IZWxwIEFjY2Vzc2liaWxpdHk8L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiBhbmQgaGVscCBjb250YWlucyBtYXJrdXAgdG8gZmFjaWxpdGF0ZSBhY2Nlc3MgYnkgdGhlIGRpc2FibGVkIGNvbW11bml0eS4gU2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL2hlbHBfYWNjZXNzaWJpbGl0eS5odG0iPkhlbHAgQWNjZXNzaWJpbGl0eTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08cD5XaGVuIHVzaW5nIHRoZSBoZWxwLCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIGNvcnJlY3RseSByZWFkIHRoZSBjb2RlIGV4YW1wbGVzIGluIHRoaXMgZG9jdW1lbnQuIFRoZSBjb252ZW50aW9ucyBmb3Igd3JpdGluZyBjb2RlIHJlcXVpcmUgdGhhdCBjbG9zaW5nIGJyYWNlcyBzaG91bGQgYXBwZWFyIG9uIGFuIG90aGVyd2lzZSBlbXB0eSBsaW5lOyBob3dldmVyLCBzb21lIHNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIHJlYWQgYSBsaW5lIG9mIHRleHQgdGhhdCBjb25zaXN0cyBzb2xlbHkgb2YgYSBicmFja2V0IG9yIGJyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaGlzIGRvY3VtZW50YXRpb24gbWF5IGNvbnRhaW4gbGlua3MgdG8gV2ViIHNpdGVzIG9mIG90aGVyIGNvbXBhbmllcyBvciBvcmdhbml6YXRpb25zIHRoYXQgd2UgZG8gbm90IGNvbnRyb2wuIFdlIG5laXRoZXIgZXZhbHVhdGUgbm9yIG1ha2UgYW55IHJlcHJlc2VudGF0aW9ucyByZWdhcmRpbmcgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlc2UgV2ViIHNpdGVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0NDMwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGFsaSBxdWljayBzdGFydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBxdWljayBzdGFydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklHQ0pBIiBuYW1lPSJCQUJJR0NKQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBxdWljayBzdGFydDwvaDE+Ci08cD48YSBpZD0ic3RocmVmOCIgbmFtZT0ic3RocmVmOCI+PC9hPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIERhbGkgdG8gY3JlYXRlIHJlbGF0aW9uYWwgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSNDSERIR0hCRiI+VGlwcyBhbmQgdHJpY2tzPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTA0OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJERkhEQSIgbmFtZT0iQkFCREZIREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY5IiBuYW1lPSJzdGhyZWY5Ij48L2E+VGhpcyBxdWljayBzdGFydCBzaG93cyBob3cgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZWxlY3QgRmlsZSAmZ3Q7IE5ldyAmZ3Q7IFByb2plY3Q8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIEpQQSBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBKUEEgUHJvamVjdDwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgYSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByb2plY3QgbmFtZTwvc3Bhbj4gKHN1Y2ggYXMgPGNvZGU+UXVpY2tTdGFydDwvY29kZT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhcmdldCBSdW50aW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5BcGFjaGUgVG9tY2F0PC9jb2RlPikgYW5kIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImJvbGQiPlV0aWxpdHkgSlBBIFByb2plY3Qgd2l0aCBKYXZhIDUuMDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgSmF2YSBzb3VyY2UgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIFRhcmdldCBSdW50aW1lIGlzIG5vdCByZXF1aXJlZCBmb3IgSmF2YSBTRSBkZXZlbG9wbWVudC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5JZiB5b3UgaGF2ZSBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcywgYWRkIHRoZW0gdG8geW91ciBjbGFzc3BhdGggYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgSlBBIEZhY2V0IGRpYWxvZywgc2VsZWN0IHlvdXIgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSAob3Igc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiksIGRhdGFiYXNlIGNvbm5lY3Rpb24gKG9yIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uKSwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgKHN1Y2ggYXMgRWNsaXBzZUxpbmspLCBkZWZpbmUgaG93IERhbGkgc2hvdWxkIG1hbmFnZSBwZXJzaXN0ZW50IGNsYXNzZXMsIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPiBpZiB5b3UgcmVxdWlyZSBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBvbmUgdGhhdCBEYWxpIGRlcml2ZXMgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiwgd2hpY2ggbWF5IGJlIGluY29ycmVjdCBpbiBzb21lIGNhc2VzLiBVc2luZyB0aGlzIG9wdGlvbiwgeW91IGNhbiBzZWxlY3QgYSBkZXZlbG9wbWVudCB0aW1lIHNjaGVtYSBmb3IgZGVmYXVsdHMgYW5kIHZhbGlkYXRpb24uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIHByb2plY3QgdG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbnMgdGhlIEpQQSBwZXJzcGVjdGl2ZS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxMCIgbmFtZT0ic3RocmVmMTAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgUHJvamVjdCBpbiBQcm9qZWN0IEV4cGxvcmVyPC9wPgotPGltZyBzcmM9ImltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nIiBhbHQ9IlBhY2thZ2UgRXhwbG9yZXIgc2hvd2luZyB0aGUgSlBBIHByb2plY3QuIiB0aXRsZT0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Tm93IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBhIHByb2plY3Qgd2l0aCBwZXJzaXN0ZW5jZSwgeW91IGNhbiBjb250aW51ZSB3aXRoIDxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jQkFCRkdEREciPkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzPC9hPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTA3OGU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkdEREciIG5hbWU9IkJBQkZHRERHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTEiIG5hbWU9InN0aHJlZjExIj48L2E+VGhpcyBxdWljayBzdGFydCBzaG93cyBob3cgdG8gY3JlYXRlIGEgbmV3IHBlcnNpc3RlbnQgSmF2YSBlbnRpdHkuIFdlIHdpbGwgY3JlYXRlIGFuIGVudGl0eSB0byBhc3NvY2lhdGUgd2l0aCBhIGRhdGFiYXNlIHRhYmxlLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBBRERSRVNTIHRhYmxlIHRvIHlvdXIgZGF0YWJhc2UuPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgJmd0OyBFbnRpdHk8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIHBhY2thZ2UgbmFtZSAoc3VjaCBhcyA8Y29kZT5xdWlja3N0YXJ0LmRlbW8ubW9kZWw8L2NvZGU+KSwgdGhlIGNsYXNzIG5hbWUgKHN1Y2ggYXMgPGNvZGU+QWRkcmVzczwvY29kZT4pIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+IGFwcGVhcnMsIHdoaWNoIGVuYWJsZXMgeW91IHRvIGRlZmluZSB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCB3aGljaCB5b3Ugd2lsbCBtYXAgdG8gdGhlIGNvbHVtbnMgb2YgYSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaWQ9InN0aHJlZjEyIiBuYW1lPSJzdGhyZWYxMiI+PC9hPjxhIGlkPSJzdGhyZWYxMyIgbmFtZT0ic3RocmVmMTMiPjwvYT5Vc2UgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIChpbnZva2VkIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+KSB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoZSBBZGRyZXNzIGNsYXNzOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLXByaXZhdGUgTG9uZyBpZDsKLXByaXZhdGUgU3RyaW5nIGNpdHk7Ci1wcml2YXRlIFN0cmluZyBjb3VudHJ5OwotcHJpdmF0ZSBTdHJpbmcgc3RhdGVPclByb3ZpbmNlOwotcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZTsKLXByaXZhdGUgU3RyaW5nIHN0cmVldDsKLTwvcHJlPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Zb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgY29sdW1ucyB0byB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZToKLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLU5VTUJFUigxMCwwKSBBRERSRVNTX0lEIChwcmltYXJ5IGtleSkKLVZBUkNIQVIyKDgwKSBQUk9WSU5DRQotVkFSQ0hBUjIoODApIENPVU5UUlkKLVZBUkNIQVIyKDIwKSBQX0NPREUKLVZBUkNIQVIyKDgwKSBTVFJFRVQKLVZBUkNIQVIyKDgwKSBDSVRZCi08L3ByZT4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLTwvcHJlPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBXaXRoIHRoZSBDcmVhdGUgSlBBIEVudGl0eSBjb21wbGV0ZWQsIEVjbGlwc2UgZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08cD5BZGRyZXNzLmphdmEgaW5jbHVkZXMgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24sIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZHMsIGFzIHdlbGwgYXMgPGNvZGU+Z2V0dGVyPC9jb2RlPiBhbmQgPGNvZGU+c2V0dGVyPC9jb2RlPiBtZXRob2RzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMuPC9wPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNCIgbmFtZT0ic3RocmVmMTQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiBBZGRyZXNzLmphdmE8L3A+Ci08aW1nIHNyYz0iaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIiBhbHQ9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgdGl0bGU9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5FY2xpcHNlIGFsc28gZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldzo8L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNSIgbmFtZT0ic3RocmVmMTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyIgYWx0PSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkFkZHJlc3M8L3NwYW4+IGNsYXNzIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcsIG5vdGljZSB0aGF0IERhbGkgaGFzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZSB3aXRoIHRoZSBlbnRpdHkgYmVjYXVzZSB0aGV5IGFyZSBuYW1lZCBpZGVudGljYWxseS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLURlcGVuZGluZyBvbiB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gdHlwZSwgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWE8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYiIG5hbWU9InN0aHJlZjE2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgQWRkcmVzcyBFbnRpdHk8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotQWZ0ZXIgYXNzb2NpYXRpbmcgdGhlIGVudGl0eSB3aXRoIHRoZSBkYXRhYmFzZSB0YWJsZSwgeW91IHNob3VsZCB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byBpbmNsdWRlIHRoaXMgSlBBIGVudGl0eS4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3MgTGlzdDwvc3Bhbj4uIERhbGkgYWRkcyB0aGUgZm9sbG93aW5nIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPHA+PGNvZGU+Jmx0O2NsYXNzJmd0O3F1aWNrc3RhcnQuZGVtby5tb2RlbC5BZGRyZXNzJmx0Oy9jbGFzcyZndDs8L2NvZGU+PC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPHA+Tm93IHdlIGFyZSByZWFkeSB0byBtYXAgZWFjaCBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgY2xhc3MgdG8gYSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5pZDwvc3Bhbj4gZmllbGQgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIGlkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgaWQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BRERSRVNTX0lEPC9zcGFuPiBpbiB0aGUgTmFtZSBmaWVsZDo8L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNyIgbmFtZT0ic3RocmVmMTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRGV0YWlscyBWaWV3IGZvciB0aGUgYWRkcmVzc0lkIEZpZWxkPC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmciIGFsdD0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgdGhlIEFkZHJlc3MgZW50aXR5JnJzcXVvO3MgaWQgYXR0cmlidXRlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgQWRkcmVzcyBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IkFERFJFU1NfSUQiKQotPC9wcmU+PC9saT4KLTxsaT4KLTxwPk1hcCBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIChhcyA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWM8L3NwYW4+IG1hcHBpbmdzKSB0byB0aGUgYXBwcm9wcmlhdGUgZGF0YWJhc2UgY29sdW1uOjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG1hcHBpbmdzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgZW50aXR5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG1hcHBpbmdzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgZW50aXR5LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzMlIiAvPgotPGNvbCB3aWR0aD0iMzMlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+RmllbGQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPk1hcCBBczwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RGF0YWJhc2UgQ29sdW1uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jaXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMy10OCI+Q0lUWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jb3VudHJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+Q09VTlRSWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wb3N0YWxDb2RlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMy10OCI+UF9DT0RFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnByb3ZpbmNlT3JTdGF0ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzMtdDgiPlBST1ZJTkNFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnN0cmVldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPlNUUkVFVDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RGFsaSBhdXRvbWF0aWNhbGx5IG1hcHMgc29tZSBmaWVsZHMgdG8gdGhlIGNvcnJlY3QgZGF0YWJhc2UgY29sdW1uIChzdWNoIGFzIHRoZSBjaXR5IGZpZWxkIHRvIHRoZSBDaXR5IGNvbHVtbikgaWYgdGhlIG5hbWVzIGFyZSBpZGVudGljYWwuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmMDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjQwY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNTFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzYwZTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Nzk3YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY3NjE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3YmRlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjYzMDBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDk2NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhYTI1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlZWYzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBtYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTkzNzUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYjY4NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NjQ4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmRkOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDI4OTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NTBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYxNjAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlYTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA0ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhlOGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM3OTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYjdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyOTRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRpZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTlkYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUyYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVmYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODAyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhY2MxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlYTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3Y2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYzk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ5YmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0ODhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODczNzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA3ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDI1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjA3OWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYzc0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlhYTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NTdlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2EwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MWY5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjM1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X3RhYmxlcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTdjOTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X3RhYmxlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OWY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI0MGJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhMWRiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiZWFjZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI3ZDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgotPGluZGV4IHZlcnNpb249IjEuMCI+Ci08ZW50cnkga2V5d29yZD0iQEJhc2ljLCBCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExNSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBDb2x1bW4sIEdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMzAiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBEaXNjcmltaW5hdG9yQ29sdW1uIj4KLTxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIyNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JWYWx1ZSI+Ci08ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5NyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMjIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJARW1iZWRkYWJsZSwgRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY4MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZCwgRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWRJZCwgRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJARW50aXR5LCBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNzMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJARW51bWVyYXRlZCwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBHZW5lcmF0ZWRWYWx1ZSwgUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjQ5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQElkLCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBJbmhlcml0YW5jZSwgU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MyIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEpvaW5Db2x1bW4iPgotPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTM4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI0NSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjQ4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQExvYiwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzNSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55LCBNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMzEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lLCBNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzNiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzLCBNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4NyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBOYW1lZFF1ZXJ5LCBDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjEwNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnksIE9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTQxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE9uZVRvT25lLCBPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQ1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE9yZGVyQnksIEdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJAU2VxdWVuY2VHZW5lcmF0b3IsIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI1MSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBUZW1wb3JhbCwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQsIFRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE1MSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBWZXJzaW9uLCBWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTU1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYXJjaGl0ZWN0dXJlIG9mIERhbGkgZmVhdHVyZSwgRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jc3RocmVmMjgzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb24gdGFibGVzLCBDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMDYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgb3ZlcnJpZGVzLCBBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMTMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgT3ZlcnJpZGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXcsIEF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjIxNSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcyI+Ci08ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldywgSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNzdGhyZWYyMjkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nLCBVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIj48dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNzdGhyZWYyMSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYmFzaWMgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQEJhc2ljLCBCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExNiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExNCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSIoU2VlIGFsc28gbWFwcGluZ3MpIj48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImNhY2hpbmcsIENhY2hpbmciPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI3N0aHJlZjI2MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImNhcmRpbmFsaXR5IC0gYXNzb2NpYXRpb24gdGFibGVzLCBBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSI+PHRvcGljIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jc3RocmVmMjA5IiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzIj4KLTxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgcGVyc2lzdGVuY2UgdG8sIEFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSwgRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3OSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVudGl0eSwgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjcxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFuYWdlZCwgTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjUwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFuYWdpbmcgcGVyc2lzdGVudCBjbGFzc2VzLCBKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjE5MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzLCBNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4NSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmcsIFN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29sdW1ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRpc2NyaW1pbmF0b3IiPgotPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iam9pbiI+Ci08ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQ3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jc3RocmVmMjQ0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYyNDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgdG8sIEdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMzEiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsdWUiPgotPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjIzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIHBvb2wsIE1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY1MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgSmF2YSBwcm9qZWN0IHRvIEpQQSwgQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI3N0aHJlZjM3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQ3JlYXRlIGEgSlBBIFByb2plY3QgV2l6YXJkLCBDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkLCBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCI+PHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNzdGhyZWYxODkiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHRhYmxlcyI+Ci08ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyBlbnRpdGllcyBmcm9tLCBHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE2MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgLSBwZXJzaXN0ZW5jZSI+Ci08ZW50cnkga2V5d29yZD0iY29ubmVjdGlvbiwgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzUiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzY2hlbWEsIFByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjc3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gLSBEYWxpLCBEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMyLmh0bSNzdGhyZWYyODIiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJlYWdlciBmZXRjaCwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVjbGlwc2VMaW5rIFhNTCBtYXBwaW5nIGZpbGUsIE1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY1MSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSBjbGFzcyI+Ci08ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUsIEVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmODEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW1iZWRkZWQgSUQgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQsIEVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTI0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIEVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTIyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQsIEVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTIwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIEVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbnRpdGllcyI+Ci08ZW50cnkga2V5d29yZD0iQEVudGl0eSBhbm5vdGF0aW9uLCBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNzQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMjAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZywgQ3JlYXRpbmcgYSBKUEEgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJjdXN0b21pemluZywgQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMiPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI3N0aHJlZjIwNSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUsIEVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmODIiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZnJvbSB0YWJsZXMiPgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iU2VsZWN0IFRhYmxlcyI+PHRvcGljIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI3N0aHJlZjIwMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZywgQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI3N0aHJlZjIwNCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcsIEpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMTIiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcywgTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nLCBDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSwgQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjExIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQiPgotPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2OSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY3NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcywgU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMTgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSwgU2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IFdpemFyZCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI3N0aHJlZjQzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSwgJmx0O2EgaWQ9JnF1b3Q7c3RocmVmNDMmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWY0MyZxdW90OyZndDsmbHQ7L2EmZ3Q7VGhlIEVudGl0eSBDbGFzcyBQYWdlIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDUiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudW1lcmF0ZWQiPgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMzkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlcnJvciBtZXNzYWdlcyAtIERhbGkiPgotPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNjYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJFcnJvciBtZXNzYWdlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIyLmh0bSNzdGhyZWYxNzEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJleHRlbnNpb24gcG9pbnRzIC0gRGFsaSBmZWF0dXJlLCBEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMyLmh0bSNzdGhyZWYyODQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJmZXRjaCB0eXBlLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjMyIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iU2VsZWN0IFRhYmxlcyI+PHRvcGljIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI3N0aHJlZjIwMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGVkIHZhbHVlcyI+Ci08ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZ3MsIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI1MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNlcXVlbmNlLCBQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJoaW50cyAtIHF1ZXJ5LCBDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjEwOSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQElkLCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyOCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iaW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTIiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI3N0aHJlZjE5NCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMjEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMsIFNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSwgU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXcsIEluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMjAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJpbnN0YWxsYXRpb24gLSBEYWxpLCBSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkphdmEgcHJvamVjdCAtIGNvbnZlcnRpbmcgdG8gSlBBLCBDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzUiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImpvaW4gY29sdW1ucyI+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIj48dG9waWMgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0jc3RocmVmMjA4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYyNDYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJqb2luZWQgdGFibGVzIC0gaW5oZXJpdGFuY2UsIFNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci08ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcywgSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNzdGhyZWYyMjciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJlbnRpdGllcywgSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjIxMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSwgSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYyODAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSwgVGhlIEphdmEgU291cmNlIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzQiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBwcm9qZWN0Ij4KLTxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIGZyb20gSmF2YSwgQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI3N0aHJlZjM2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgbmV3LCBDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImltcGxlbWVudGF0aW9uLCBKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjE5MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InBhZ2UsICZsdDthIGlkPSZxdW90O3N0aHJlZjI5JnF1b3Q7IG5hbWU9JnF1b3Q7c3RocmVmMjkmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O1NlbGVjdGluZyB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjMxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGxhdGZvcm0sIFByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjc0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3LCBKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjU0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibGF6eSBmZXRjaCwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzNCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImxpYnJhcnkgLSBKUEEsIEpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQE1hbnlUb01hbnksIE1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEzMiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMzAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIG1hcHBpbmciPgotPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9PbmUsIE1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTM1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIE1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTM0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci08ZW50cnkga2V5d29yZD0iQE1hcHBlZFN1cGVyY2xhc3MsIE1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjg2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIE1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjg0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFwcGluZyBlbnRpdGllcywgQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjEyIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGZpbGUiPgotPGVudHJ5IGtleXdvcmQ9IiZsdDthIGlkPSZxdW90O3N0aHJlZjU3JnF1b3Q7IG5hbWU9JnF1b3Q7c3RocmVmNTcmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O01hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNjAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI3N0aHJlZjE5NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZ3MiPgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIj48dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNzdGhyZWYyMiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImJhc2ljLCBCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkLCBFbWJlZGRlZCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjExNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIElELCBFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI3N0aHJlZjEyMSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IklELCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyNSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tbWFueSwgTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTI5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFueS10by1vbmUsIE1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnksIE9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSwgT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InByb2JsZW1zLCBWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTY5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0idHJhbnNpZW50LCBUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uLCBWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJuYW1lZCBxdWVyaWVzIj4KLTxlbnRyeSBrZXl3b3JkPSJlbnRpdHksIENyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmMTA2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iaGludHMsIENyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibmF0aXZlIHF1ZXJpZXMsIENyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmMTExIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJub25wZXJzaXN0ZW50Ij4KLTxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzLCBBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY2NyIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmaWVsZHMuIFNlZSB0cmFuc2llbnQiPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tbWFueSBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJAT25lVG9NYW55LCBPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjE0MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjE0MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJAT25lVG9PbmUsIE9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxNDYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im9yZGVyaW5nLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQyIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvcm0ueG1sIGZpbGUiPgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBUaGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0iY29uY2VwdHMwMDMuaHRtI3N0aHJlZjI0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iY3JlYXRpbmcsIEpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMTkzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFuYWdpbmcsIE1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI3N0aHJlZjU3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2FtcGxlLCBNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNzdGhyZWY1OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im92ZXJyaWRlcyAtIEpQQSBhdHRyaWJ1dGVzLCBBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMTQiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMTkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSBjb25uZWN0aW9uLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3NiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHNjaGVtYSwgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJlbnRpdHkgY2xhc3MsIEFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib3B0aW9ucywgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJwcm92aWRlciwgTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIFRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNzdGhyZWYyMyIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci08ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2FtcGxlLCBNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNDgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzeW5jaHJvbml6aW5nIHdpdGggY2xhc3NlcywgU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjU0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCBlbnRpdHksIEVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY3MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InBlcnNwZWN0aXZlIC0gSlBBIERldmVsb3BtZW50LCBKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI3N0aHJlZjI4MSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIC0gSlBBLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3MyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InByb2JsZW1zLCBWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTY4IiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci08ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib3B0aW9ucywgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJxdWVyeSBoaW50cywgQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWYxMDgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJxdWljayBzdGFydCAtIERhbGksIERhbGkgcXVpY2sgc3RhcnQiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtI3N0aHJlZjgiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InJlcXVpcmVtZW50cyI+Ci08ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzLCBSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMsIEVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNjaGVtYSAtIGRhdGFiYXNlLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSB0YWJsZXMsIFNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjE2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IFRhYmxlcyAtIGluIEphdmEgRGV0YWlscyB2aWV3LCBTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIxOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSwgU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzdXBlcmNsYXNzLCBNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4OSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmcgY2xhc3NlcyB3aXRoIHBlcnNpc3RlbmNlLnhtbCBmaWxlLCBTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTUiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFzc29jaWF0aW9ucyI+Ci08ZW50cnkga2V5d29yZD0iVGFibGUgQXNzb2NpYXRpb25zIj48dG9waWMgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNzdGhyZWYyMDMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBlbnRpdGllcyBmcm9tIj4KLTxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImluaGVyaXRhbmNlLCBTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwMSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSwgU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMTciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBvcmFsIj4KLTxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjM2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idHJhbnNpZW50IG1hcHBpbmciPgotPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQsIFRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE1MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZlcnNpb24gbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQFZlcnNpb24sIFZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmlld3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3Ij4KLTxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jc3RocmVmMjExIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNzdGhyZWYyMjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldywgSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI1MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Indhcm5pbmcgbWVzc2FnZXMgLSBEYWxpLCBWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTY3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApLCBSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IsIFdvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNC5odG0jc3RocmVmNjMiIC8+PC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjU2YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TGVnYWw8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI4OSIgbmFtZT0ic3RocmVmMjg5Ij48L2E+PC9wPgotPGgxPkxlZ2FsPC9oMT4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgMjAxMCwgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVjMDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgRG9jdW1lbnRhdGlvbiAtIERvYwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotanBhRGV2ZWxvcG1lbnQ9SlBBIERldmVsb3BtZW50Ci1jcmVhdGVBSnBhUHJvamVjdD1DcmVhdGUgYSBKUEEgcHJvamVjdAotY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdC4KLWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5PUNyZWF0ZSBhIHBlcnNpc3RlbnQgZW50aXR5Ci1jcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IGNyZWF0ZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkuCi1NYXBBUGVyc2lzdGVudEVudGl0eT1NYXAgYSBwZXJzaXN0ZW50IGVudGl0eQotTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBtYXAgdGhlIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byBhIGRhdGFiYXNlIHRhYmxlLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyYzUxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgVE9DICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBGMSAgIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0JCTxjb250ZXh0cyBmaWxlPSJjb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBLZXl3b3JkIEluZGV4IC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0JCTxpbmRleCBmaWxlPSJpbmRleC54bWwiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gQ2hlYXRzaGVldHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSIlanBhRGV2ZWxvcG1lbnQiIGlkPSJjb20uanBhLmNhdGVnb3J5Ii8+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVjcmVhdGVBSnBhUHJvamVjdCIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5jcmVhdGVwcm9qZWN0MSI+Ci0JCQk8ZGVzY3JpcHRpb24+JWNyZWF0ZUFKcGFQcm9qZWN0RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVjcmVhdGVBUGVyc2lzdGVudEVudGl0eSIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQuYWRkZW50aXR5Ij4KLQkJCTxkZXNjcmlwdGlvbj4lY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJU1hcEFQZXJzaXN0ZW50RW50aXR5IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5tYXBlbnRpdHkiPgotCQkJPGRlc2NyaXB0aW9uPiVNYXBBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eUNsYXNzUGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eUNsYXNzUGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTYxMjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW50aXR5IENsYXNzIHBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkVJR0YiIG5hbWU9IkNJQUZFSUdGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgQ2xhc3MgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NSIgaGVhZGVycz0icjFjMS10NSI+U291cmNlIEZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMi10NSI+VGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NSIgaGVhZGVycz0icjFjMS10NSI+SmF2YSBQYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5DbGFzcyBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5TdXBlcmNsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMyLXQ1Ij5TZWxlY3QgdGhlIHN1cGVyY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+SW5oZXJpdGFuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ1IHIxYzItdDUiPkJlY2F1c2UgdGhlIHdpemFyZCBjcmVhdGVzIGEgSmF2YSBjbGFzcyB3aXRoIGFuIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uLCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBpZiB5b3UgZGVmaW5lZCBhIHN1cGVyY2xhc3MuPC9wPgotPHA+VG8gYWRkIGFuIDxjb2RlPkBJbmhlcml0YW5jZTwvY29kZT4gbm90YXRpb24gdG8gdGhlIGVudGl0eSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChkZXNjcmliZWQgaW4gSlNSIDIyMCk6PC9wPgotPHVsPgotPGxpPgotPHA+U0lOR0xFX1RBQkxFIC0tIEFsbCBjbGFzc2VzIGluIGEgaGllcmFyY2h5IGFzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS4gVGhpcyBhbm5vdGF0aW9uIGlzIHdpdGhvdXQgYW4gYXR0cmlidXRlIGZvciB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRBQkxFX1BFUl9DTEFTUyAtLSBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KT0lORUQgLS0gVGhlIHJvb3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0YWJsZS4gRWFjaCBzdWJjbGFzcyBpcyByZXByZXNlbnRlZCBieSBhIHNlcGFyYXRlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhvc2UgZmllbGRzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzdWJjbGFzcyAobm90IGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcmNsYXNzKSwgYXMgd2VsbCBhcyB0aGUgY29sdW1uKHMpIHRoYXQgcmVwcmVzZW50IGl0cyBwcmltYXJ5IGtleS4gVGhlIHByaW1hcnkga2V5IGNvbHVtbihzKSBvZiB0aGUgc3ViY2xhc3MgdGFibGUgc2VydmVzIGFzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHByaW1hcnkga2V5IG9mIHRoZSBzdXBlcmNsYXNzIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NSByMWMzLXQ1Ij5FbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NCIgbmFtZT0ic3RocmVmMTk0Ij48L2E+WE1MIEVudGl0eSBNYXBwaW5nczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMi10NSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTDwvc3Bhbj4gdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuCi08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwaW5nIGZpbGU8L3NwYW4+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdG8gdXNlLiBCeSBkZWZhdWx0LCBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIHRoZSA8Y29kZT5NRVRBLUlORi9vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjAwNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREVDSUEiIG5hbWU9IkNJQURFQ0lBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj4mbmJzcDs8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IiIgc3VtbWFyeT0iVGhpcyB0YWJsZSB0byBiZSBjb252ZXJ0ZWQgdG8gaW5mb3JtYWwuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzItdDYiPgotPHA+VGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGVudGVyZWQgYXMgdGhlIGNsYXNzIG5hbWUuIElmIHRoZSBlbnRpdHkgbmFtZSBkaWZmZXJzIGZyb20gdGhlIGNsYXNzIG5hbWUsIHRoZW4gdGhlIGVudGl0eSBuYW1lIGlzIGFkZGVkIGFzIGFuIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6IDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzMtdDYiPgotPHA+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+VGFibGUgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBkZWZhdWx0PC9zcGFuPiB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbWFwcGVkIHRhYmxlIG5hbWUgdG8gdGhlIGVudGl0eSBuYW1lLiBPdGhlcndpc2UsIGNsZWFyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IG9wdGlvbiBhbmQgZW50ZXIgdGhlIG5hbWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPlRhYmxlIE5hbWU8L3NwYW4+IGZpZWxkLiBUaGVzZSBvcHRpb25zIHJlc3VsdCBpbiB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gb3B0aW9uIHRvIHRoZSBKYXZhIGNsYXNzIGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMzLXQ2Ij4KLTxwPlVzZSBkZWZhdWx0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ2IiBoZWFkZXJzPSJyMWMxLXQ2Ij4KLTxwPkVudGl0eSBGaWVsZHM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ2IHIxYzItdDYiPgotPHA+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IGJ1dHRvbiB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHVzaW5nIHRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4gVGhpcyBkaWFsb2cgZW5hYmxlIHlvdSB0byBidWlsZCBhIGZpZWxkIGJ5IGVudGVyaW5nIGEgZmllbGQgbmFtZSBhbmQgc2VsZWN0aW5nIGFtb25nIHBlcnNpc3RlbmNlIHR5cGVzLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gb3B0aW9uIGVuYWJsZXMgeW91IHRvIG1hcmsgYSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LiBUaGUgZGlhbG9nJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24gZW5hYmxlcyB5b3UgdG8gYWRkIG90aGVyIHBlcnNpc3RlbmNlIHR5cGVzIGRlc2NyaWJlZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RWRpdDwvc3Bhbj4gYnV0dG9uIGVuYWJsZXMgeW91IHRvIGNoYW5nZSB0aGUgbmFtZSBvciB0eXBlIHNldCBmb3IgYSBwZXJzaXN0ZW50IGZpZWxkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMy10NiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+QWNjZXNzIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzItdDYiPgotPHA+U2VsZWN0IHdoZXRoZXIgdGhlIGVudGl0eSdzIGFjY2VzcyB0byBpbnN0YW5jZSB2YXJpYWJsZXMgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4gJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NiByMWMzLXQ2Ij4KLTxwPkZpZWxkPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2FkZF9jb252ZXJ0ZXIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODgyMmM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBZGQgQ29udmVydGVyIGRpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdDR0lKIiBuYW1lPSJDSUFHQ0dJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QWRkIENvbnZlcnRlciBkaWFsb2c8L2gxPgotPHA+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBhIG5ldyBFY2xpcHNlTGluayBjb252ZXJ0ZXIuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWxNYXgiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgb24gdGhlIE5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJyb3dzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzOSByMWMyLXQzOSI+RW50ZXIgdGhlIG5hbWUgZm9yIHRoaXMgY29udmVydGVyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM5IHIxYzItdDM5Ij5TZWxlY3QgdGhlIGNvbnZlcnRlciB0eXBlOgotPHVsPgotPGxpPgotPHA+Q3VzdG9tPC9wPgotPC9saT4KLTxsaT4KLTxwPk9iamVjdCB0eXBlPC9wPgotPC9saT4KLTxsaT4KLTxwPlN0cnVjdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UeXBlPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4IiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc2YzNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Bc3NvY2lhdGlvbiBDYXJkaW5hbGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXNzb2NpYXRpb24gQ2FyZGluYWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSUlGSCIgbmFtZT0iQ0lBRklJRkgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDgiIG5hbWU9InN0aHJlZjIwOCI+PC9hPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IGNhcmRpbmFsaXR5IG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLiBEZXBlbmRpbmcgb24gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Bc3NvY2lhdGlvbiBLaW5kPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW4gQ29sdW1uczwvc3Bhbj4gdGhhdCB5b3Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgc29tZSBhc3NvY2lhdGlvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuPC9wPgotPHVsPgotPGxpPgotPHA+TWFueSB0byBvbmU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG1hbnk8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG9uZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NYW55IHRvIG1hbnk8L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwOWFmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBc3NvY2lhdGlvbiBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHSkhEQyIgbmFtZT0iQ0lBR0pIREMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIFRhYmxlczwvaDE+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQXNzb2NpYXRpb24gVGFibGVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEyIiBoZWFkZXJzPSJyMWMxLXQxMiI+QXNzb2NpYXRpb24ga2luZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEyIHIxYzItdDEyIj5TcGVjaWZ5IGlmIHRoZSBhc3NvY2lhdGlvbiBpcyA8c3BhbiBjbGFzcz0iYm9sZCI+U2ltcGxlPC9zcGFuPiAoMTpNKSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueSB0byBNYW55PC9zcGFuPiAoTTpNKS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiB0YWJsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMiByMWMyLXQxMiI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlIFNlbGVjdGlvbjwvc3Bhbj4sIHRoZW4gc2VsZWN0IHRoZSB0d28gdGFibGVzIHRvIGFzc29jaWF0ZS4KLTxwPldoZW4gY3JlYXRpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueSB0byBNYW55PC9zcGFuPiBhc3NvY2lhdGlvbiwgeW91IGNhbiBzZWxlY3QgYSA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbiBUYWJsZTwvc3Bhbj4gZm9yIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTAxNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTBaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBR0JGSkUiIG5hbWU9IkNJQUdCRkpFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2gxPgotPHA+VXNlIHRoZSBHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgV2l6YXJkIHRvIGNyZWF0ZSBlbnRpdGllcyBmcm9tIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSI+U2VsZWN0IFRhYmxlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNDSUFDRElDQiI+VGFibGUgQXNzb2NpYXRpb25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI0NJQUVKREJFIj5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSI+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY3YTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHR0dERiIgbmFtZT0iQ0lBR0dHREYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIEpQQSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gcXVpY2tseSBhZGQgYW4gZW50aXR5IGFuZCBhbHNvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhhdCBlbnRpdHkuIEluIGFkZGl0aW9uLCB0aGlzIHdpemFyZCBhZGRzIHRoZSBhY2Nlc3NvciBtZXRob2RzICg8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+KSBpbiB0aGUgY2xhc3MgZmlsZS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVkMTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkdISUYiIG5hbWU9IkNJQUZHSElGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDUiIG5hbWU9InN0aHJlZjIwNSI+PC9hPjxhIGlkPSJzdGhyZWYyMDYiIG5hbWU9InN0aHJlZjIwNiI+PC9hPlVzZSB0aGUgQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiB3aXphcmQgdG8gc3BlY2lmeSBhc3NvY2lhdGlvbiB0YWJsZXMgd2hlbiBnZW5lcmF0aW5nIGFuIGVudGl0eS48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSNDSUFHSkhEQyI+QXNzb2NpYXRpb24gVGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyI+Sm9pbiBDb2x1bW5zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtI0NJQUZJSUZIIj5Bc3NvY2lhdGlvbiBDYXJkaW5hbGl0eTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JkYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDSUdFRSIgbmFtZT0iQ0lBQ0lHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDQiIG5hbWU9InN0aHJlZjIwNCI+PC9hPlVzZSB0aGlzIHBhZ2UgdG8gY3VzdG9taXplIGVhY2ggZ2VuZXJhdGVkIGVudGl0eS4gU2VsZWN0IGFuIGl0ZW0gaW4gdGhlIFRhYmxlIGFuZCBjb2x1bW5zIGFyZWEsIHRoZW4gY29tcGxldGUgdGhlIGZvbGxvd2luZyBmaWVsZHMgZm9yIGVhY2ggaXRlbS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEluZGl2aWR1YWwgRW50aXRpZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEluZGl2aWR1YWwgRW50aXRpZXMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+VGFibGUgTWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDExIHIxYzItdDExIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIHRhYmxlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7S2V5Jm5ic3A7Z2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTEgcjFjMi10MTEiPlNlbGVjdCB0aGUgZ2VuZXJhdG9yIHVzZWQgZm9yIHRoaXMgbWFwcGluZy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO25hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMSByMWMyLXQxMSI+RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VxdWVuY2UuCi08cD5Zb3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0iYm9sZCI+JHRhYmxlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPiRwazwvc3Bhbj4gYXMgdmFyaWFibGVzIGluIHRoZSBuYW1lLiBUaGVzZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAocmVzcGVjdGl2ZWx5KSB3aGVuIERhbGkgZ2VuZXJhdGVzIGEgdGFibGUgbWFwcGluZy48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj4mbmJzcDsmbmJzcDtFbnRpdHkmbmJzcDthY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMSByMWMyLXQxMSI+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbnRpdHkgYWNjZXNzIG1ldGhvZDogPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAoZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj5Eb21haW4gSmF2YSBDbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDExIHIxYzItdDExIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIGNsYXNzIGluZm9ybWF0aW9uICg8c3BhbiBjbGFzcz0iYm9sZCI+U3VwZXJjbGFzczwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5JbnRlcmZhY2VzPC9zcGFuPikgZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2IwMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVKREJFIiBuYW1lPSJDSUFFSkRCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwMyIgbmFtZT0ic3RocmVmMjAzIj48L2E+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uIERhbGkgd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBlbnRpdGllcyBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZXMuIFlvdSB3aWxsIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcyBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZW50aXRpZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQ3VzdG9tIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24gZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+VGFibGUgTWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEwIHIxYzItdDEwIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIHRhYmxlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7S2V5Jm5ic3A7Z2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMi10MTAiPlNlbGVjdCB0aGUgZ2VuZXJhdG9yIHVzZWQgZm9yIHRoaXMgbWFwcGluZy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO25hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMCByMWMyLXQxMCI+RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VxdWVuY2UuCi08cD5Zb3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0iYm9sZCI+JHRhYmxlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPiRwazwvc3Bhbj4gYXMgdmFyaWFibGVzIGluIHRoZSBuYW1lLiBUaGVzZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAocmVzcGVjdGl2ZWx5KSB3aGVuIERhbGkgZ2VuZXJhdGVzIGEgdGFibGUgbWFwcGluZy48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtFbnRpdHkmbmJzcDthY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbnRpdHkgYWNjZXNzIG1ldGhvZDogPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAoZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtBc3NvY2lhdGlvbnMmbmJzcDtmZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGZldGNoIG1vZGUgZm9yIGFzc29jaWF0aW9uczogPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQ8L3NwYW4+LCBhcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5MYXp5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtDb2xsZWN0aW9uJm5ic3A7dHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGlmIHRoZSBjb2xsZWN0aW9uIHByb3BlcnRpZXMgYXJlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNldDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkxpc3Q8L3NwYW4+LgotPHA+RW5hYmxlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnM8L3NwYW4+IG9wdGlvbiB0byBoYXZlIERhbGkgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMCByMWMyLXQxMCI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlBhY2thZ2U8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+U3VwZXJjbGFzczwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNzVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHREdIQyIgbmFtZT0iQ0FDR0RHSEMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvaDE+Ci08cD5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBkZWZhdWx0IG1hcHBpbmcgYW5kIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI0NBQ0VBR0JHIj5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI0NJQUZHQUlKIj5HZW5lcmF0b3JzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIj5RdWVyaWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTcuaHRtI0NJQURHQ0lEIj5Db252ZXJ0ZXJzPC9hPiAod2hlbiB1c2luZyBFY2xpcHNlTGluayk8L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoZXNlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzZXR0aW5ncyBvbiBhIHNwZWNpZmljIGVudGl0eSBvciBtYXBwaW5nLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzVhNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFREVKRiIgbmFtZT0iQ0lBRURFSkYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC9oMT4KLTxwPlNwZWNpZnkgdGhlIGxvY2F0aW9uIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBFY2xpcHNlTGluayBtYXBwaW5nIGZpbGUgKDxjb2RlPmVjbGlzcGVsaW5rLW9ybS54bWw8L2NvZGU+KS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzOCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+UHJvamVjdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM4IHIxYzItdDM4Ij5TZWxlY3QgdGhlIHByb2plY3QgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+U291cmNlIGZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM4IHIxYzItdDM4Ij5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBhbmQgc2VsZWN0IHRoZSBzb3VyY2UgZmlsZSBpbiB3aGljaCB0byBhZGQgdGhlIG1hcHBpbmcgZmlsZS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+Li4vPC9jb2RlPjxjb2RlPjxzcGFuIGNsYXNzPSJjb2RlaW5saW5laXRhbGljIj4mbHQ7UFJPSkVDVCZndDs8L3NwYW4+PC9jb2RlPjxjb2RlPi9zcmM8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzOCIgaGVhZGVycz0icjFjMS10MzgiPkZpbGUgcGF0aDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM4IHIxYzItdDM4Ij5FbnRlciB0aGUgZmlsZW5hbWUgYW5kIHBhdGggb2YgdGhlIG1hcHBpbmcgZmlsZS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+TUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+RGVmYXVsdCBhY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzOCByMWMyLXQzOCI+U2VsZWN0IHdoZXRoZXIgdGhlIGVudGl0eSdzIGFjY2VzcyB0byBpbnN0YW5jZSB2YXJpYWJsZXMgaXMgPHNwYW4gY2xhc3M9ImJvbGQiPmZpZWxkPC9zcGFuPi1iYXNlZCBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJvcGVydHk8L3NwYW4+LWJhc2VkLCBhcyBkZWZpbmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5BZGQgdG8gcGVyc2lzdGVuY2UgdW5pdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM4IHIxYzItdDM4Ij5TcGVjaWZ5IGlmIHRoaXMgbWFwcGluZyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCAoPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPikuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+Jm5ic3A7Jm5ic3A7UGVyc2lzdGVuY2UmbmJzcDtVbml0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzggcjFjMi10MzgiPlNlbGVjdCB0aGUgcGVyc2lzdGVuY2UgdW5pdCBpbiB3aGljaCB0byBhZGQgdGhlIG1hcHBpbmcgZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4IiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUpFSURKIj5NYXBwaW5nIEZpbGU8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXZhX3BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXZhX3BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg5M2FmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SmF2YSBQYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKYXZhIFBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHRUJBQSIgbmFtZT0iQ0lBR0VCQUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkphdmEgUGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YSBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPlNvdXJjZSBmb2xkZXJzIG9uIGJ1aWxkIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzItdDMiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgRm9sZGVyPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgSmF2YSBzb3VyY2UgZm9sZGVyIHRvIGFkZCB0byB0aGlzIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MyByMWMzLXQzIj5FY2xpcHNlTGluazwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5EZWZhdWx0IG91dHB1dCBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSZuYnNwOzxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj5idWlsZFxjbGFzc2VzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qb2luX2NvbHVtbnMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qb2luX2NvbHVtbnMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3ZTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBDb2x1bW5zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFR0VFRyIgbmFtZT0iQ0lBRUdFRUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA3IiBuYW1lPSJzdGhyZWYyMDciPjwvYT5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvcD4KLTxwPkNsaWNrIEFkZCB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgYmV0d2VlbiB0aGUgdHdvIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmMmFlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRmFjZXQgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTBaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNJRkRJRiIgbmFtZT0iQ0FDSUZESUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBGYWNldCBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBKUEEgRmFjZXQgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMi10NCI+VmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0IHIxYzMtdDQiPkVjbGlwc2VMaW5rPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPkpQQSBJbXBsZW1lbnRhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMi10NCI+U2VsZWN0IGEgc3BlY2lmaWMgSlBBIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5NYW5hZ2UgbGlicmFyaWVzPC9zcGFuPiB0byBjcmVhdGUgb3IgdXBkYXRlIGEgdXNlciBsaWJyYXJ5LjwvcD4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIGRvd25sb2FkIGEgc3BlY2lmaWMgbGlicmFyeSBjb25maWd1cmF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO1R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0IHIxYzItdDQiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlciBMaWJyYXJ5PC9zcGFuPiB0byBzZWxlY3QgZnJvbSB0aGUgYXZhaWxhYmxlIHVzZXItZGVmaW5lZCBvciBkb3dubG9hZGVkIGxpYnJhcmllcy4KLTxwPklmIHlvdSBzZWxlY3QgRGlzYWJsZSwgeW91IG11c3QgbWFudWFsbHkgaW5jbHVkZSB0aGUgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMy10NCI+VXNlciBMaWJyYXJ5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO0luY2x1ZGUgbGlicmFyaWVzIHdpdGggdGhpcyBhcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIGFyZSBpbmNsdWRlZCB3aGVuIGRlcGxveWluZyB0aGUgYXBwbGljYXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMzLXQ0Ij5TZWxlY3RlZDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMyLXQ0Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggdGhlIHByb2plY3QuIERhbGkgcmVxdWlyZXMgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIGFuZCB2YWxpZGF0ZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwcGluZ3MuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIGNvbm5lY3Rpb248L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO092ZXJyaWRlJm5ic3A7ZGVmYXVsdCBzY2hlbWEgZnJvbSBjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBzY2hlbWEgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDQgcjFjMy10NCI+VGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgRGFsaS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NCIgaGVhZGVycz0icjFjMS10NCI+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMyLXQ0Ij5TZWxlY3QgdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZTwvc3Bhbj4sIG9yIHNlbGVjdCBhIHNwZWNpZmljIDxzcGFuIGNsYXNzPSJib2xkIj5pbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCdzIEphdmEgQnVpbGQgUGF0aC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvc3Bhbj4gdG8gY3JlYXRlIGEgZGVmYXVsdCBsaWJyYXJ5IGZvciB0aGUgcHJvamVjdCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9zcGFuPiB0byBkZWZpbmUgYWRkaXRpb25hbCBsaWJyYXJpZXMuPC9wPgotPHA+RGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgR2VuZXJpYyBvciBFY2xpcHNlTGluayksIGRpZmZlcmVudCBvcHRpb25zIG1heSBiZSBhdmFpbGFibGUgd2hlbiB3b3JraW5nIHdpdGggSlBBIHByb2plY3RzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPjxhIGlkPSJzdGhyZWYxOTEiIG5hbWU9InN0aHJlZjE5MSI+PC9hPlBlcnNpc3RlbnQgY2xhc3MgbWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiBEYWxpIHdpbGwgPHNwYW4gY2xhc3M9ImJvbGQiPmRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIGF1dG9tYXRpY2FsbHk8L3NwYW4+LCBvciBpZiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPmFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+IGZpbGUuCi08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm90ZTwvc3Bhbj46IFRvIGluc3VyZSBhcHBsaWNhdGlvbiBwb3J0YWJpbGl0eSwgeW91IHNob3VsZCBleHBsaWNpdGx5IGxpc3QgdGhlIG1hbmFnZWQgcGVyc2lzdGVuY2UgY2xhc3NlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQ0IHIxYzMtdDQiPkRldGVybWluZWQgYnkgc2VydmVyLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+Q3JlYXRlIDxjb2RlPm9ybS54bWw8L2NvZGU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYSBkZWZhdWx0IDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZm9yIHlvdXIgZW50aXR5IG1hcHBpbmdzIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjIwYWJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSEZJSiIgbmFtZT0iQ0FDQkhGSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkphdmEgRGV0YWlscyB2aWV3PC9zcGFuPiBmb3IgZWFjaCBtYXBwaW5nIHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNyUiIC8+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTYiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDE2Ij5BdmFpbGFibGUgZm9yIE1hcHBpbmcgVHlwZTwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5NYXBwaW5nIFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMi10MTYiPkNsaWNraW5nIHRoZSBuYW1lIG9mIHRoZSBtYXBwaW5nIHR5cGUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBpbnZva2VzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gVXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzMtdDE2Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzQtdDE2Ij5BbGwgbWFwcGluZyB0eXBlczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNHQ0JIQiIgbmFtZT0iQ0FDR0NCSEIiPjwvYT5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWMyLXQxNiI+PGEgaWQ9InN0aHJlZjIyOSIgbmFtZT0ic3RocmVmMjI5Ij48L2E+PGEgaWQ9InN0aHJlZjIzMCIgbmFtZT0ic3RocmVmMjMwIj48L2E+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QENvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWMzLXQxNiI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMyLXQxNiI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QENvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtUYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE2IHIxYzItdDE2Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7SW5zZXJ0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIElOU0VSVDwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMzLXQxNiI+VHJ1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7VXBkYXRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGlzIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIFVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWMzLXQxNiI+VHJ1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7VW5pcXVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIDxjb2RlPlVOSVFVRTwvY29kZT4gY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxNiByMWMzLXQxNiI+RmFsc2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO051bGxhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWMzLXQxNiI+VHJ1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0xlbmd0aDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgY29sdW1uIGxlbmd0aC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjMy10MTYiPjI1NTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtQcmVjaXNpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIHByZWNpc2lvbiBmb3IgdGhlIGNvbHVtbiB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE2IHIxYzMtdDE2Ij4wPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1NjYWxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRoYXQgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgZGVjaW1hbCBwb2ludC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTYgcjFjMy10MTYiPjA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7Q29sdW1uIERlZmluaXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTYgcjFjMi10MTYiPkRlZmluZSB0aGUgRERMIGZvciBhIGNvbHVtbi4gVGhpcyBpcyB1c2VkIHdoZW4gYSB0YWJsZSBpcyBiZWluZyBnZW5lcmF0ZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0dHR0hCIiBuYW1lPSJDQUNHR0dIQiI+PC9hPjxhIGlkPSJzdGhyZWYyMzEiIG5hbWU9InN0aHJlZjIzMSI+PC9hPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPjxhIGlkPSJzdGhyZWYyMzMiIG5hbWU9InN0aHJlZjIzMyI+PC9hPkZldGNoIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTYgcjFjMi10MTYiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlOgotPHVsPgotPGxpPgotPHA+RWFnZXIgJm5kYXNoOyBEYXRhIGlzIGxvYWRlZCBpbiBiZWZvcmUgaXQgaXMgYWN0dWFsbHkgbmVlZGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5ICZuZGFzaDsgRGF0YSBpcyBsb2FkZWQgb25seSB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0cmFuc2FjdGlvbi48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxNiByMWMzLXQxNiI+RWFnZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE1YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWMzLXQxNiI+WWVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE2YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0JCSUJJIiBuYW1lPSJDQUNCQklCSSI+PC9hPjxhIGlkPSJzdGhyZWYyMzQiIG5hbWU9InN0aHJlZjIzNCI+PC9hPkxvYjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNmMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSBpZiB0aGUgZmllbGQgaXMgbWFwcGVkIHRvIDxjb2RlPmphdmEuc3FsLkNsb2I8L2NvZGU+IG9yIDxjb2RlPmphdmEuc3FsLkJsb2I8L2NvZGU+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QExvYjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTdjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDRUFKR0QiIG5hbWU9IkNBQ0VBSkdEIj48L2E+PGEgaWQ9InN0aHJlZjIzNSIgbmFtZT0ic3RocmVmMjM1Ij48L2E+PGEgaWQ9InN0aHJlZjIzNiIgbmFtZT0ic3RocmVmMjM2Ij48L2E+PGEgaWQ9InN0aHJlZjIzNyIgbmFtZT0ic3RocmVmMjM3Ij48L2E+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTdjMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotPHVsPgotPGxpPgotPHA+RGF0ZSAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLkRhdGU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lc3RhbXAgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AVGVtcG9yYWw8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTdjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE4YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9InN0aHJlZjIzOCIgbmFtZT0ic3RocmVmMjM4Ij48L2E+PGEgaWQ9InN0aHJlZjIzOSIgbmFtZT0ic3RocmVmMjM5Ij48L2E+PGEgaWQ9InN0aHJlZjI0MCIgbmFtZT0ic3RocmVmMjQwIj48L2E+RW51bWVyYXRlZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGlmIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIHN1aXRzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzIG9yIHRvIG1hdGNoIGFuIGV4aXN0aW5nIGRhdGFiYXNlIHNjaGVtYS4KLTx1bD4KLTxsaT4KLTxwPm9yZGluYWw8L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+U3RyaW5nPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEVudW1lcmF0ZWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDE2IHIxYzMtdDE2Ij5PcmRpbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDE2IHIxYzQtdDE2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE5YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxNiByMWMyLXQxNiI+VGhlIHBlcnNpc3RlbnQgZW50aXR5IHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIwYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pBSUhCIiBuYW1lPSJDQUNKQUlIQiI+PC9hPkNhc2NhZGUgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eS4KLTx1bD4KLTxsaT4KLTxwPkFsbCAmbmRhc2g7IEFsbCBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+TW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVmcmVzaDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjBjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIxYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pESkpBIiBuYW1lPSJDQUNKREpKQSI+PC9hPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMyLXQxNiI+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0ICJvd25zIiB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9ubHkgb24gdGhlIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0RBRElIIiBuYW1lPSJDQUNEQURJSCI+PC9hPjxhIGlkPSJzdGhyZWYyNDEiIG5hbWU9InN0aHJlZjI0MSI+PC9hPjxhIGlkPSJzdGhyZWYyNDIiIG5hbWU9InN0aHJlZjI0MiI+PC9hPk9yZGVyIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeToKLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbSBvcmRlcmluZzwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9yZGVyQnk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzMtdDE2Ij5QcmltYXJ5IGtleTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPi4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWMyLXQxNiI+T3ZlcnJpZGVzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3Mgb2YgYSBtYXBwZWQgc3VwZXJjbGFzcyAoZm9yIGV4YW1wbGUsIGlmIHRoZSBpbmhlcml0ZWQgY29sdW1uIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggYSBwcmUtZXhpc3RpbmcgZGF0YSBtb2RlbCwgb3IgaW52YWxpZCBhcyBhIGNvbHVtbiBuYW1lIGluIHlvdXIgZGF0YWJhc2UpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+Ci08cD48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzMmU2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgSlBBIFByb2plY3QgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkFHQyIgbmFtZT0iQ0FDQkpBR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBOZXcgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IG5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzItdDIiPk5hbWUgb2YgdGhlIEVjbGlwc2UgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MiIgaGVhZGVycz0icjFjMS10MiI+UHJvamVjdCBjb250ZW50czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIgcjFjMi10MiI+TG9jYXRpb24gb2YgdGhlIHdvcmtzcGFjZSBpbiB3aGljaCB0byBzYXZlIHRoZSBwcm9qZWN0LgotPHA+VW5zZWxlY3QgVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgRGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYSBuZXcgbG9jYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMzLXQyIj5DdXJyZW50IHdvcmtzcGFjZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5UYXJnZXQgcnVudGltZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIgcjFjMi10MiI+U2VsZWN0IGEgcHJlLWRlZmluZWQgdGFyZ2V0IGZvciB0aGUgcHJvamVjdC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXc8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB3aXRoIHRoZSBOZXcgU2VydmVyIFJ1bnRpbWUgd2l6YXJkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPkNvbmZpZ3VyYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gd2l0aCBwcmUtZGVmaW5lZCBmYWNldHMuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPiZsdDtjdXN0b20mZ3Q7PC9zcGFuPiB0byBtYW51YWxseSBzZWxlY3QgdGhlIGZhY2V0cyBmb3IgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIgcjFjMy10MiI+VXRpbGl0eSBKUEEgcHJvamVjdCB3aXRoIEphdmEgNS4wPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPkVBUiBtZW1iZXJzaGlwPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuCi08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FQVIgUHJvamVjdCBOYW1lPC9zcGFuPiwgb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IEVBUiBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPldvcmtpbmcgc2V0czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMi10MiI+U3BlY2lmeSBpZiB0aGlzIHByb2plY3Qgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFuIGV4aXN0aW5nIHdvcmtpbmcgc2V0LiBUaGUgZHJvcCBkb3duIGZpZWxkIHNob3dzIGEgbGlzdCBvZiBwcmV2aW91cyBzZWxlY3RlZCB3b3JraW5nIHNldHMuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBwcm9qZWN0IHRvIHdvcmtpbmcgc2V0czwvc3Bhbj4sIHRoZW4gc2VsZWN0IGEgd29ya2luZyBzZXQgaW4gd2hpY2ggdG8gYWRkIHRoaXMgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTIyOTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKR0JHIiBuYW1lPSJDQUNCSkdCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE4OCIgbmFtZT0ic3RocmVmMTg4Ij48L2E+VGhlIENyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgbmV3IEphdmEgcHJvamVjdCB1c2luZyBKUEEuIFRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSNDQUNCSkFHQyI+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtI0NJQUdFQkFBIj5KYXZhIFBhZ2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjNWU3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJRkdKIiBuYW1lPSJDSUFDSUZHSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbDwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI1NSIgbmFtZT0ic3RocmVmMjU1Ij48L2E+PGEgaWQ9InN0aHJlZjI1NiIgbmFtZT0ic3RocmVmMjU2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYWwgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCZyc3F1bztzIEdlbmVyYWwgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMzLXQyNCI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjQgcjFjMi10MjQiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMzLXQyNCI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNCByMWMyLXQyNCI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzMtdDI0Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkpBUiBGaWxlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI0IHIxYzItdDI0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFjMjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkFGIiBuYW1lPSJCQUJJRkJBRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMjYiIG5hbWU9InN0aHJlZjIyNiI+PC9hPjxhIGlkPSJzdGhyZWYyMjciIG5hbWU9InN0aHJlZjIyNyI+PC9hPjxhIGlkPSJzdGhyZWYyMjgiIG5hbWU9InN0aHJlZjIyOCI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcHBlZCBhdHRyaWJ1dGUgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXJlYXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZmUyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgU3RydWN0dXJlIHZpZXc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkVHR0ZFIiBuYW1lPSJCQUJFR0dGRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIFN0cnVjdHVyZSB2aWV3PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNTIiIG5hbWU9InN0aHJlZjI1MiI+PC9hPjxhIGlkPSJzdGhyZWYyNTMiIG5hbWU9InN0aHJlZjI1MyI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIFN0cnVjdHVyZTwvc3Bhbj4gdmlldyBkaXNwbGF5cyBhbiBvdXRsaW5lIG9mIHRoZSBzdHJ1Y3R1cmUgKGl0cyBhdHRyaWJ1dGVzIGFuZCBtYXBwaW5ncykgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBvcGVuZWQgaW4gdGhlIGVkaXRvci4gVGhlIHN0cnVjdHVyYWwgZWxlbWVudHMgc2hvd24gaW4gdGhlIG91dGxpbmUgYXJlIHRoZSBlbnRpdHkgYW5kIGl0cyBmaWVsZHMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjU0IiBuYW1lPSJzdGhyZWYyNTQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TYW1wbGUgSlBBIFN0cnVjdHVyZSBWaWV3PC9wPgotPGltZyBzcmM9ImltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nIiBhbHQ9IlNhbXBsZSBKUEEgU3RydWN0dXJlIHZpZXcgZm9yIGFuIGVudGl0eS4iIHRpdGxlPSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNjMDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkRCIiBuYW1lPSJCQUJJRkJEQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyODEiIG5hbWU9InN0aHJlZjI4MSI+PC9hPjxhIGlkPSJzdGhyZWYyODIiIG5hbWU9InN0aHJlZjI4MiI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBkZWZpbmVzIHRoZSBpbml0aWFsIHNldCBhbmQgbGF5b3V0IG9mIHZpZXdzIGluIHRoZSBXb3JrYmVuY2ggd2luZG93IHdoZW4gdXNpbmcgRGFsaS4gQnkgZGVmYXVsdCwgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgdmlld3M6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jb25jZXB0cy00Lmh0bSI+UGVyc3BlY3RpdmVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3ZmU2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUVCQiIgbmFtZT0iQkFCRkFFQkIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwOSIgbmFtZT0ic3RocmVmMjA5Ij48L2E+PGEgaWQ9InN0aHJlZjIxMCIgbmFtZT0ic3RocmVmMjEwIj48L2E+PGEgaWQ9InN0aHJlZjIxMSIgbmFtZT0ic3RocmVmMjExIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50aXR5IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIHRhYnM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNDQUNJSkJHSCI+QXR0cmlidXRlIG92ZXJyaWRlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNDQUNCSElEQSI+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIj5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjdhY2VhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NISUQiIG5hbWU9IkNJQUNDSElEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9oMT4KLTxwPlRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGVuYWJsZXMgeW91IHRvIHVwZGF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIEZvciBwcm9qZWN0cyB1c2luZyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBwZXJpc2lzdGVuY2UueG1sIEVkaXRvciBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE5Lmh0bSNDSUFKQUZFRyI+Q3VzdG9taXphdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCI+Q2FjaGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIyLmh0bSNDSUFGSkNIRSI+T3B0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiI+U2NoZW1hIEdlbmVyYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgdGhlIGZvbGxvd2luZyBzdWJzZXQgb2YgdGhlc2UgcGFnZXMgaXMgYXZhaWxhYmxlOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFISkRGRiI+UHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCI+U291cmNlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGU4MTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNDQUIiIG5hbWU9IkNBQ0ZDQ0FCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC9zcGFuPiBhcmVhIGluIEpQQSBEZXRhaWxzIHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4gdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTkiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDQkFKQkMiIG5hbWU9IkNBQ0JBSkJDIj48L2E+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT48YSBpZD0ic3RocmVmMjQ5IiBuYW1lPSJzdGhyZWYyNDkiPjwvYT5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLiBUaGVzZSBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QEdlbmVyYXRlZFZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5HZW5lcmF0ZWQgVmFsdWU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDSkVFRUMiIG5hbWU9IkNBQ0pFRUVDIj48L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMyLXQxOSI+Ci08dWw+Ci08bGk+QXV0bzwvbGk+Ci08bGk+Ci08cD5JZGVudGl0eSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgdGhlIGRhdGFiYXNlJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPklkZW50aXR5PC9zcGFuPiBjb2x1bW4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIHNlcXVlbmNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0ZGSEVIIj5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBkYXRhYmFzZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNHRkVBSCI+VGFibGUgR2VuZXJhdG9yPC9hPikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMzLXQxOSI+QXV0bzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJCQUJFRUFISiIgbmFtZT0iQkFCRUVBSEoiPjwvYT4mbmJzcDsmbmJzcDtHZW5lcmF0b3IgTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHZhbHVlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDR0ZFQUgiIG5hbWU9IkNBQ0dGRUFIIj48L2E+VGFibGUgR2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMi10MTkiPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIGRhdGFiYXNlIHRhYmxlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AVGFibGVHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4mbmJzcDs9Jm5ic3A7PHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtUYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE5IHIxYzItdDE5Ij5EYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMi10MTkiPlRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIGdlbmVyYXRvcidzIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4gdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ZhbHVlIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE5IHIxYzItdDE5Ij5UaGUgdmFsdWUgZm9yIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJpbWFyeSBLZXkgQ29sdW1uPC9zcGFuPiBpbiB0aGUgZ2VuZXJhdG9yIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJDQUNGRkhFSCIgbmFtZT0iQ0FDRkZIRUgiPjwvYT5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+PGEgaWQ9InN0aHJlZjI1MSIgbmFtZT0ic3RocmVmMjUxIj48L2E+VGhlc2UgZmllbGRzIGRlZmluZSB0aGUgc3BlY2lmaWMgc2VxdWVuY2UgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBTZXF1ZW5jZUdlbmVyYXRvcjwvY29kZT4gYW5ub3RhdGlvbi4KLTxwPlRoZXNlIGZpZWxkcyBhcHBseSBvbmx5IHdoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJib2xkIj5TZXF1ZW5jZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMyLXQxOSI+TmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUgdG8gdXNlIGZvciBkZWZpbmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMi10MTkiPlVuaXF1ZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVmNTRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkpIQkNJIiBuYW1lPSJCQUJKSEJDSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI3MCIgbmFtZT0ic3RocmVmMjcwIj48L2E+PGEgaWQ9InN0aHJlZjI3MSIgbmFtZT0ic3RocmVmMjcxIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBQZXJzaXN0ZW5jZTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+PGEgaWQ9InN0aHJlZjI3MiIgbmFtZT0ic3RocmVmMjcyIj48L2E+PGEgaWQ9InN0aHJlZjI3MyIgbmFtZT0ic3RocmVmMjczIj48L2E+PGEgaWQ9InN0aHJlZjI3NCIgbmFtZT0ic3RocmVmMjc0Ij48L2E+PGEgaWQ9InN0aHJlZjI3NSIgbmFtZT0ic3RocmVmMjc1Ij48L2E+UGxhdGZvcm08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+TGlicmFyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZXIgTGlicmFyeTwvc3Bhbj4gdG8gc2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB1c2VyLWRlZmluZWQgb3IgZG93bmxvYWRlZCBsaWJyYXJpZXMuCi08cD5JZiB5b3Ugc2VsZWN0IERpc2FibGUsIHlvdSBtdXN0IG1hbnVhbGx5IGluY2x1ZGUgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtJbmNsdWRlJm5ic3A7bGlicmFyaWVzJm5ic3A7d2l0aCZuYnNwO3RoaXMmbmJzcDthcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM2IHIxYzItdDM2Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij48YSBpZD0ic3RocmVmMjc2IiBuYW1lPSJzdGhyZWYyNzYiPjwvYT48YSBpZD0ic3RocmVmMjc3IiBuYW1lPSJzdGhyZWYyNzciPjwvYT48YSBpZD0ic3RocmVmMjc4IiBuYW1lPSJzdGhyZWYyNzgiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzYgcjFjMi10MzYiPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtjYXRhbG9nJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzNiByMWMyLXQzNiI+U2VsZWN0IGEgY2F0YWxvZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtzY2hlbWEmbmJzcDtmcm9tJm5ic3A7Y29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+UGVyc2lzdGVudCBDbGFzcyBNYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzYgcjFjMi10MzYiPlNwZWNpZnkgaWYgRGFsaSB3aWxsIDxzcGFuIGNsYXNzPSJib2xkIj5kaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhdXRvbWF0aWNhbGx5PC9zcGFuPiwgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5hbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlLgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vdGU8L3NwYW4+OiBUbyBpbnN1cmUgYXBwbGljYXRpb24gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPjxhIGlkPSJzdGhyZWYyNzkiIG5hbWU9InN0aHJlZjI3OSI+PC9hPjxhIGlkPSJzdGhyZWYyODAiIG5hbWU9InN0aHJlZjI4MCI+PC9hPkNhbm9uaWNhbCBNZXRhbW9kZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MzYgcjFjMi10MzYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDI0Lmh0bSNCQUJEQkNCSSI+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0VGFibGVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0VGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhMzk2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBUYWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlbGVjdCBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0dFRSIgbmFtZT0iQ0lBSENHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBUYWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5OSIgbmFtZT0ic3RocmVmMTk5Ij48L2E+PGEgaWQ9InN0aHJlZjIwMCIgbmFtZT0ic3RocmVmMjAwIj48L2E+PGEgaWQ9InN0aHJlZjIwMSIgbmFtZT0ic3RocmVmMjAxIj48L2E+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkYTc0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2VsZWN0IENhc2NhZGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkRHSUoiIG5hbWU9IkNJQUZER0lKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2gxPgotPHA+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGFzc29jaWF0aW9uOiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBSZW1vdmUsIG9yIFJlZnJlc2guPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl90YWJsZUFzc29jaWF0aW9ucy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzOWYyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGFibGUgQXNzb2NpYXRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDRElDQiIgbmFtZT0iQ0lBQ0RJQ0IiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlRhYmxlIEFzc29jaWF0aW9uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjAyIiBuYW1lPSJzdGhyZWYyMDIiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFRhYmxlIEFzc29jaWF0aW9ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPlRhYmxlIGFzc29jaWF0aW9uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDkgcjFjMi10OSI+U2VsZWN0IGFuIGFzc29jaWF0aW9uIHRvIG1vZGlmeSBvciBjbGljayB0byBjcmVhdGUgYSBuZXcgdGFibGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT4gd2l6YXJkLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5HZW5lcmF0ZSB0aGlzIGFzc29jaWF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OSByMWMyLXQ5Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSB0aGUgc2VsZWN0ZWQgYXNzb2NpYXRpb24uIElmIGVuYWJsZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQ2FyZGluYWxpdHkgYW5kIEpvaW4gdGFibGUgZm9yIHRoZSB0YWJsZSBhc3NvY2lhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OSIgaGVhZGVycz0icjFjMS10OSI+R2VuZXJhdGUgYSByZWZlcmVuY2UgdG8gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1JPVyZndDs8L3NwYW4+IGluIDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRSZndDs8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OSByMWMyLXQ5Ij5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkgc2hvdWxkIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLTxwPklmIGVuYWJsZWQsIHlvdSBjYW4gYWxzbyBlbnRlciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiBuYW1lIGFuZCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DYXNjYWRlPC9zcGFuPiBtZXRob2QgKGFsbCwgcGVyc2lzdCwgbWVyZ2UsIHJlbW92ZSwgb3IgcmVmcmVzaCkgZm9yIHRoZSByZWZlcmVuY2UuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOWYxZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlZmVyZW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4NyIgbmFtZT0ic3RocmVmMTg3Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI2Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwZjkyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV2l6YXJkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0pKSkpIIiBuYW1lPSJDQUNKSkpKSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2l6YXJkczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyB3aXphcmRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBR0hDR0EiPkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Yzg2ZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJSkNDRSIgbmFtZT0iQ0lBSUpDQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2gxPgotPHA+VGhlIE1hcHBpbmcgRmlsZSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gYWRkIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyZWQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LCB5b3UgY2FuIGxhdGVyIGFkZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byB0aGUgc3JjIGZpbGUgb2YgdGhlIHByb2plY3QgdXNpbmcgdGhpcyB3aXphcmQuPC9wPgotPHA+VGhlIDxhIGhyZWY9IiNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4gY29uc2lzdHMgb2YgdGhlIE1hcHBpbmcgRmlsZSBwYWdlLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU5NGY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwaW5nIEZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFKRUlESiIgbmFtZT0iQ0lBSkVJREoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYxOTciIG5hbWU9InN0aHJlZjE5NyI+PC9hPjxhIGlkPSJzdGhyZWYxOTgiIG5hbWU9InN0aHJlZjE5OCI+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYzMzJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcyBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdIQ0dBIiBuYW1lPSJDSUFHSENHQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhY2VmMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0eSBwYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKSUlHIiBuYW1lPSJDQUNESklJRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydHkgcGFnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhhNmIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NBR0dDIiBuYW1lPSJDQUNDQUdHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjE3JSIgLz4KLTxjb2wgd2lkdGg9IjI1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMyI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTMiPkF2YWlsYWJsZSBmb3IgRW50aXR5Jm5ic3A7VHlwZTwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5NYXBwaW5nIFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPkNsaWNraW5nIHRoZSBuYW1lIG9mIHRoZSBtYXBwaW5nIHR5cGUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBpbnZva2VzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gVXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZW50aXR5OiBNYXBwZWQgU3VwZXJjbGFzcywgRW1iZWRkYWJsZSBvciB0aGUgZGVmYXVsdCBtYXBwaW5nIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMy10MTMiPkVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4sIDxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4sIGFuZCA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMi10MTMiPlRoZSBkZWZhdWx0IGRhdGFiYXNlIHRhYmxlIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eS4gVGhlc2UgZmllbGRzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNDQUNJSkJHSCI+QXR0cmlidXRlIG92ZXJyaWRlczwvYT4gYXJlYS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+VGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtDYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMi10MTMiPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMy10MTMiPkFzIGRlZmluZWQgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO1NjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzItdDEzIj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTMgcjFjMy10MTMiPkFzIGRlZmluZWQgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMyLXQxMyI+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjMi10MTMiPlRoZSBhY2Nlc3MgbWV0aG9kIGZvciB0aGlzIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMyByMWMzLXQxMyI+RmllbGQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+UHJpbWFyeSZuYnNwO2tleSZuYnNwO2NsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjMi10MTMiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgZW50aXR5LiBDbGlja2luZyB0aGUgZmllbGQgbmFtZSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBoeXBlcmxpbmssIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgbmV3IGNsYXNzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWM0LXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkNhY2hhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzItdDEzIj5TcGVjaWZpZXMgaWYgdGhlIGVudGl0eSBpcyBjYWNoYWJsZS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDYWNoYWJsZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTMgcjFjMy10MTMiPkBDYWNoYWJsZShmYWxzZSk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmMmFjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXR0cmlidXRlIG92ZXJyaWRlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lKQkdIIiBuYW1lPSJDQUNJSkJHSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXR0cmlidXRlIG92ZXJyaWRlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjEyIiBuYW1lPSJzdGhyZWYyMTIiPjwvYT48YSBpZD0ic3RocmVmMjEzIiBuYW1lPSJzdGhyZWYyMTMiPjwvYT48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBhcmVhIG9mIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlIG92ZXJyaWRlcyBnZW5lcmFsbHkgb3ZlcnJpZGUvY29uZmlndXJlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgaW5oZXJpdGVkIG9yIGVtYmVkZGVkLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEF0dHJpYnV0ZSBvdmVycmlkZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDE0Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODU3NDU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JISURBIiBuYW1lPSJDQUNCSElEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTUiIG5hbWU9InN0aHJlZjIxNSI+PC9hPjxhIGlkPSJzdGhyZWYyMTYiIG5hbWU9InN0aHJlZjIxNiI+PC9hPjxhIGlkPSJzdGhyZWYyMTciIG5hbWU9InN0aHJlZjIxNyI+PC9hPjxhIGlkPSJzdGhyZWYyMTgiIG5hbWU9InN0aHJlZjIxOCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyB0byBhc3NvY2lhdGUgYWRkaXRpb25hbCB0YWJsZXMgd2l0aCBhbiBlbnRpdHkuIFVzZSB0aGlzIGFyZWEgaWYgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGVudGl0eSBpcyBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ5NzBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SW5oZXJpdGFuY2UgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkhHSEUiIG5hbWU9IkNBQ0ZIR0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE5IiBuYW1lPSJzdGhyZWYyMTkiPjwvYT48YSBpZD0ic3RocmVmMjIwIiBuYW1lPSJzdGhyZWYyMjAiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SW5oZXJpdGFuY2U8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmeSB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWFwcGluZyBhIGNsYXNzIG9yIGNsYXNzIGhpZXJhcmNoeToKLTx1bD4KLTxsaT4KLTxwPlNpbmdsZSB0YWJsZSAmbmRhc2g7IEFsbCBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkICZuZGFzaDsgVGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGU7IGVhY2ggY2hpbGQgbWFwcyB0byBpdHMgb3duIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSBwZXIgY2xhc3MgJm5kYXNoOyBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzMtdDE1Ij5TaW5nbGUgdGFibGU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjIxIiBuYW1lPSJzdGhyZWYyMjEiPjwvYT48YSBpZD0ic3RocmVmMjIyIiBuYW1lPSJzdGhyZWYyMjIiPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjIzIiBuYW1lPSJzdGhyZWYyMjMiPjwvYT48YSBpZD0ic3RocmVmMjI0IiBuYW1lPSJzdGhyZWYyMjQiPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGVzZSBmaWVsZHMgYXJlIGF2YWlsYWJsZSB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EZXRhaWxzPC9zcGFuPiBhcmVhIHRvIGRlZmluZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhpcyBEaXNjcmltaW5hdG9yIENvbHVtbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij4mbmJzcDsmbmJzcDtUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMi10MTUiPlNldCB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMyLXQxNSI+VXNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgbmV3IEpvaW4gQ29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB3aXRoIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkzNjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5RdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJRdWVyaWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyMjUiIG5hbWU9InN0aHJlZjIyNSI+PC9hPgotPGgxPlF1ZXJpZXM8L2gxPgotPHA+VXNlIHRoZSBxdWVyaWVzIGFyZWEgb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gY3JlYXRlIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLiBSZWZlciB0byA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCSUdCR0ciPiJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIjwvYT4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQklHQkdHIj5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MTIxYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCQUVCQyIgbmFtZT0iQ0FDQkFFQkMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2gxPgotPHA+VXNlIGFyZWEgdG8gc3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBCeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBUYWJsZTwvc3Bhbj4gYXJlYSBpbiA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+dGhlIEpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+IGFuZCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiBtYXBwaW5nIHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIFRhYmxlIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIFRhYmxlIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMi10MTciPk5hbWUgb2YgdGhlIGpvaW4gdGFibGUgdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzMtdDE3Ij5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+PGEgaWQ9IkNBQ0JCREZHIiBuYW1lPSJDQUNCQkRGRyI+PC9hPkpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzItdDE3Ij48YSBpZD0ic3RocmVmMjQzIiBuYW1lPSJzdGhyZWYyNDMiPjwvYT48YSBpZD0ic3RocmVmMjQ0IiBuYW1lPSJzdGhyZWYyNDQiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+SW52ZXJzZSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMyLXQxNyI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE3IHIxYzMtdDE3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMjguaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NGNkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGQ0VKQyIgbmFtZT0iQ0FDRkNFSkMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ1IiBuYW1lPSJzdGhyZWYyNDUiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBUYWJsZTwvc3Bhbj4gYXJlYSBpbiA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiBtYXBwaW5nIHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+PGEgaWQ9InN0aHJlZjI0NiIgbmFtZT0ic3RocmVmMjQ2Ij48L2E+PGEgaWQ9InN0aHJlZjI0NyIgbmFtZT0ic3RocmVmMjQ3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ5N2FmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0FDR0giIG5hbWU9IkNBQ0NBQ0dIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5UaGUgSmF2YSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIHBhY2thZ2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtzY2hlbWEmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7Y2F0YWxvZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIwIHIxYzItdDIwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGFjY2VzcyBtZXRob2QgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHByb2plY3Q6Ci08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GaWVsZDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2FjY2VzcyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjViOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRUFHQkciIG5hbWU9IkNBQ0VBR0JHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIFBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+Jmx0O3BlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+WE1MIE1hcHBpbmcgRGF0YSBDb21wbGV0ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzItdDIxIj5TcGVjaWZpZXMgdGhhdCB0aGUgSmF2YSBjbGFzc2VzIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBhcmUgZnVsbHkgc3BlY2lmaWVkIGJ5IHRoZWlyIG1ldGFkYXRhLiBBbnkgYW5ub3RhdGlvbnMgd2lsbCBiZSBpZ25vcmVkLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3htbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+Q2FzY2FkZSBQZXJzaXN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMi10MjEiPkFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2Nhc2NhZGUtcGVyc2lzdCZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlNjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzItdDIxIj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7c2NoZW1hJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIxIHIxYzItdDIxIj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2NhdGFsb2cmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5BY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmeSBob3cgdGhlIGVudGl0eSBpdHMgYWNjZXNzIGluc3RhbmNlIHZhcmlhYmxlcy4KLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5ICZuZGFzaDsgUGVyc2lzdGVudCBzdGF0ZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzLiBUaGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBtdXN0IGJlIDxzcGFuIGNsYXNzPSJib2xkIj5wdWJsaWM8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5wcml2YXRlPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RmllbGQgJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMzLXQyMSI+UHJvcGVydHk8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDllZTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdG9yczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdG9ycyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZHQUlKIiBuYW1lPSJDSUFGR0FJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdG9yczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmF0b3IgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+R2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMi10MjIiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBTZXF1ZW5jZSBhbmQgVGFibGUgZ2VuZXJhdG9ycy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgU2VxdWVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgVGFibGU8L3NwYW4+IHRvIGFkZCBhIG5ldyBnZW5lcmF0b3IuPC9wPgotPHA+Rm9yIHNlcXVlbmNlIGdlbmVyYXRvcnMsIHlvdSBtdXN0IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5hbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+U2NoZW1hPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhdGFsb2c8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsb2NhdGlvbiBzaXplPC9wPgotPC9saT4KLTxsaT4KLTxwPkluaXRpYWwgdmFsdWU8L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciB0YWJsZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPlNjaGVtYTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXRhbG9nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5WYWx1ZSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbG9jYXRpb24gc2l6ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1N2FhNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDJiMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnRlcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjUzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRlcnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFER0NJRCIgbmFtZT0iQ0lBREdDSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnRlcnM8L2gxPgotPHA+VGhlIENvbnZlcnRlcnMgaW5mb3JtYXRpb24gaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcgYXBwbGllcyBvbmx5IHdoZW4gdXNpbmcgRWNsaXBzZUxpbms8L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29udmVydGVyLCB1c2luZyB0aGUgPGEgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIuaHRtI0NJQUdDR0lKIj5BZGQgQ29udmVydGVyIGRpYWxvZzwvYT4uPC9wPgotPHA+Jm5ic3A7PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDJkNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29ubmVjdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNTciIG5hbWU9InN0aHJlZjI1NyI+PC9hPjxhIGlkPSJzdGhyZWYyNTgiIG5hbWU9InN0aHJlZjI1OCI+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDcyZDk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUpBRkVHIiBuYW1lPSJDSUFKQUZFRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXphdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ3VzdG9taXphdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNTkiIG5hbWU9InN0aHJlZjI1OSI+PC9hPjxhIGlkPSJzdGhyZWYyNjAiIG5hbWU9InN0aHJlZjI2MCI+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+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCAob3IgY3JlYXRlKSBhIEphdmEgY2xhc3MgdG8gaGFuZGxlIGV4Y2VwdGlvbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Yjc4NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DYWNoaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDYWNoaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQkVEQ0giIG5hbWU9IkNJQUJFRENIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjYxIiBuYW1lPSJzdGhyZWYyNjEiPjwvYT5DYWNoaW5nPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjYyIiBuYW1lPSJzdGhyZWYyNjIiPjwvYT48YSBpZD0ic3RocmVmMjYzIiBuYW1lPSJzdGhyZWYyNjMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgQ2FjaGluZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwmcnNxdW87cyBDYWNoaW5nIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+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+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzMtdDI4Ij4KLTxwPldlYWsgd2l0aCBzb2Z0IHN1YmNhY2hlPC9wPgotPC90ZD4KLTwvdHI+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4ZjMxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkxvZ2dpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkxvZ2dpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY0IiBuYW1lPSJzdGhyZWYyNjQiPjwvYT48YSBpZD0ic3RocmVmMjY1IiBuYW1lPSJzdGhyZWYyNjUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3MmE0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSkNIRSIgbmFtZT0iQ0lBRkpDSEUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk9wdGlvbnM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY2IiBuYW1lPSJzdGhyZWYyNjYiPjwvYT48YSBpZD0ic3RocmVmMjY3IiBuYW1lPSJzdGhyZWYyNjciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlIiBzdW1tYXJ5PSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDMzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlNlc3Npb24gTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgdGhlIG5hbWUgYnkgd2hpY2ggdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gaXMgc3RvcmVkIGluIHRoZSBzdGF0aWMgc2Vzc2lvbiBtYW5hZ2VyLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBFY2xpcHNlTGluayBzaGFyZWQgc2Vzc2lvbiBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBKUEEgb3IgdG8gdXNlIGEgcHJlLWV4aXN0aW5nIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJlZCB0aHJvdWdoIGEgRWNsaXBzZUxpbmsgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBhIHZhbGlkIEVjbGlwc2VMaW5rIHNlc3Npb24gbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiBhIHNlcnZlciBkZXBsb3ltZW50LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSIgdmFsdWU9Ik15U2Vzc2lvbiIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbnMgWE1MPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgKDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4pLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIGFzIGFuIGFsdGVybmF0aXZlIHRvIGFubm90YXRpb25zIGFuZCBkZXBsb3ltZW50IFhNTC4gSWYgeW91IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgRWNsaXBzZUxpbmsgd2lsbCBvdmVycmlkZSBhbGwgY2xhc3MgYW5ub3RhdGlvbiBhbmQgdGhlIG9iamVjdCByZWxhdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiwgYXMgd2VsbCBhcyA8Y29kZT5PUk0ueG1sPC9jb2RlPiBhbmQgb3RoZXIgbWFwcGluZyBmaWxlcywgaWYgcHJlc2VudC48L3A+Ci08cD5JbmRpY2F0ZSB0aGUgc2Vzc2lvbiBieSBzZXR0aW5nIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9uLW5hbWU8L2NvZGU+IHByb3BlcnR5LjwvcD4KLTxwPk5vdGU6IElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHksIDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4gZmlsZSB3aWxsIG5vdCBiZSB1c2VkLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHNlc3Npb25zIFhNTCBmaWxlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9InRvcGxpbmsuc2Vzc2lvbi14bWwiIHZhbHVlPSJteXNlc3Npb24ueG1sIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgRGF0YWJhc2U8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMyLXQzMyI+Ci08cD5TZWxlY3QgdGhlIHRhcmdldCBkYXRhYmFzZS4gWW91IGNhbiBhbHNvIHNldCB0aGUgdmFsdWUgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLkRhdGFiYXNlUGxhdGZvcm0gY2xhc3M8L2NvZGU+LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnRhcmdldC1kYXRhYmFzZSIgdmFsdWU9Ik9yYWNsZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzMgcjFjMy10MzMiPgotPHA+QXV0bzwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+VGFyZ2V0IFNlcnZlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNlbGVjdCB0aGUgdGFyZ2V0IHNlcnZlciBmb3IgeW91ciBKUEEgYXBwbGljYXRpb24uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LXNlcnZlciIgdmFsdWU9Ik9DNEpfMTBfMV8zIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzMyByMWMzLXQzMyI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5FdmVudCBMaXN0ZW5lcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgYSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGFkZGVkIGR1cmluZyBib290c3RyYXBwaW5nLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uRXZlbnRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tZXZlbnQtbGlzdGVuZXIiIHZhbHVlPSJteXBhY2thZ2UuTXlDbGFzcy5jbGFzcyIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+SW5jbHVkZSBEZXNjcmlwdG9yIFF1ZXJpZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMyByMWMyLXQzMyI+Ci08cD5FbmFibGUgb3IgZGlzYWJsZSB0aGUgZGVmYXVsdCBjb3B5aW5nIG9mIGFsbCBuYW1lZCBxdWVyaWVzIGZyb20gdGhlIGRlc2NyaXB0b3JzIHRvIHRoZSBzZXNzaW9uLiBUaGVzZSBxdWVyaWVzIGluY2x1ZGUgdGhlIG9uZXMgZGVmaW5lZCB1c2luZyBFY2xpcHNlTGluayBBUEksIGRlc2NyaXB0b3IgYW1lbmRtZW50IG1ldGhvZHMsIGFuZCBzbyBvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5NaXNjZWxsYW5lb3VzIE9wdGlvbnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMyLXQzMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+Jm5ic3A7Jm5ic3A7VGVtcG9yYWwgbXV0YWJsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgaWYgYWxsIDxjb2RlPkRhdGU8L2NvZGU+IGFuZCA8Y29kZT5DYWxlbmRhcjwvY29kZT4gcGVyc2lzdGVudCBmaWVsZHMgc2hvdWxkIGJlIGhhbmRsZWQgYXMgbXV0YWJsZSBvYmplY3RzLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnRlbXBvcmFsLm11dGFibGUiIHZhbHVlPSJ0cnVlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQzMyByMWMzLXQzMyI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxODE0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNjaGVtYSBHZW5lcmF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTY2hlbWEgR2VuZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDRkNCIiBuYW1lPSJDSUFDQ0ZDQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U2NoZW1hIEdlbmVyYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgU2NoZW1hIEdlbmVyYXRpb24gcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2OCIgbmFtZT0ic3RocmVmMjY4Ij48L2E+PGEgaWQ9InN0aHJlZjI2OSIgbmFtZT0ic3RocmVmMjY5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj4mbmJzcDs8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciZyc3F1bztzIFNjaGVtYSBHZW5lcmF0aW9uIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MzUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5EREwgR2VuZXJhdGlvbiBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzUgcjFjMi10MzUiPgotPHA+U2VsZWN0IHRoZSB0eXBlIG9mIERETCBnZW5lcmF0aW9uOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob25lPC9zcGFuPiAtLSBEbyBub3QgZ2VuZXJhdGUgRERMOyBubyBzY2hlbWEgaXMgZ2VuZXJhdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Q3JlYXRlIFRhYmxlczwvc3Bhbj4gLS0gQ3JlYXRlIERETCBmb3Igbm9uLWV4aXN0ZW50IHRhYmxlczsgbGVhdmUgZXhpc3RpbmcgdGFibGVzIHVuY2hhbmdlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3AgYW5kIENyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIGFsbCB0YWJsZXM7IGRyb3AgYWxsIGV4aXN0aW5nIHRhYmxlcy48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM1IHIxYzMtdDM1Ij4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPk91dHB1dCBNb2RlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzUgcjFjMi10MzUiPgotPHA+U2VsZWN0IHRoZSBEREwgZ2VuZXJhdGlvbiB0YXJnZXQ6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkJvdGg8L3NwYW4+IC0tIEdlbmVyYXRlIFNRTCBmaWxlcyBhbmQgZXhlY3V0ZSB0aGVtIG9uIHRoZSBkYXRhYmFzZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlPC9zcGFuPiAtLSBFeGVjdXRlIFNRTCBvbiB0aGUgZGF0YWJhc2Ugb25seSAoZG8gbm90IGdlbmVyYXRlIFNRTCBmaWxlcykuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TUUwgU2NyaXB0PC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgb25seSAoZG8gbm90IGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UpLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzUgcjFjMy10MzUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RERMIEdlbmVyYXRpb24gTG9jYXRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNSByMWMyLXQzNSI+Ci08cD5TcGVjaWZ5IHdoZXJlIEVjbGlwc2VMaW5rIHdyaXRlcyBEREwgb3V0cHV0LiBTcGVjaWZ5IGEgZmlsZSBzcGVjaWZpY2F0aW9uIHRvIGEgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBoYXZlIHdyaXRlIGFjY2Vzcy4gVGhlIGZpbGUgc3BlY2lmaWNhdGlvbiBtYXkgYmUgcmVsYXRpdmUgdG8geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9yIGFic29sdXRlLiBJZiBpdCBkb2VzIG5vdCBlbmQgaW4gYSBmaWxlIHNlcGFyYXRvciwgdGhlbiBFY2xpcHNlTGluayBhcHBlbmRzIG9uZSB0aGF0IGlzIHZhbGlkIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzUgcjFjMy10MzUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+Q3JlYXRlIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNSByMWMyLXQzNSI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGNyZWF0aW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLiBTcGVjaWZ5IGEgZmlsZSBuYW1lIHZhbGlkIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzUgcjFjMy10MzUiPgotPHA+Y3JlYXRlRERMLmpkYmM8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRyb3AgRERMIEZpbGUgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgRERMIGZpbGUgdGhhdCBFY2xpcHNlTGluayBnZW5lcmF0ZXMgdGhhdCBjb250YWlucyBTUUwgc3RhdGVtZW50cyBmb3IgZHJvcHBpbmcgdGFibGVzIGZvciBKUEEgZW50aXRpZXMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzUgcjFjMy10MzUiPgotPHA+ZHJvcERETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM0YjRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSEpERkYiIG5hbWU9IkNJQUhKREZGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0aWVzPC9oMT4KLTxwPlRoaXMgcGFnZSBlbmFibGVzIHlvdSB0byBhZGQgb3IgcmVtb3ZlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvcD4KLTxwPlRvIGFkZCBhIHByb3BlcnR5LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0aGVuIGVudGVyIHRoZSBwcm9wZXJ0eSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5WYWx1ZTwvc3Bhbj4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjZjEyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U291cmNlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTb3VyY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0pBSCIgbmFtZT0iQ0lBSENKQUgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNvdXJjZTwvaDE+Ci08cD5Vc2luZyB0aGlzIHBhZ2UsIHlvdSBjYW4gbWFudWFsbHkgZWRpdCB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZmNTJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5QcmVmZXJlbmNlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNERUlFRSIgbmFtZT0iQ0FDREVJRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByZWZlcmVuY2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHByZWZlcmVuY2UgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2I3NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkRpYWxvZ3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRpYWxvZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUpEQSIgbmFtZT0iQ0FDR0VKREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRpYWxvZ3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjguaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtI0NJQUZER0lKIj5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIj5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc0YjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NHRUhDIiBuYW1lPSJDQUNDR0VIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9oMT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nIHRvIGNyZWF0ZSBvciBtb2RpZnkgdGhlIGpvaW4gdGFibGVzIGFuZCBjb2x1bW5zIGluIHJlbGF0aW9uc2hpcCBtYXBwaW5ncy48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM3IHIxYzItdDM3Ij5OYW1lIG9mIHRoZSBqb2ludCB0YWJsZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNyByMWMyLXQzNyI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IHJlZmVyZW5jZSBmb3IgdGhlIGVudGl0eSByZWxhdGlvbnNoaXAuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkYjVhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SWNvbnMgYW5kIGJ1dHRvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ikljb25zIGFuZCBidXR0b25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREhDSUEiIG5hbWU9IkNBQ0RIQ0lBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5JY29ucyBhbmQgYnV0dG9uczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGUgaWNvbnMgYW5kIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNHRUFDRyI+SWNvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDREpDRUkiPkJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwNzExNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkljb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFQUNHIiBuYW1lPSJDQUNHRUFDRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBpY29ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDQwIj5JY29uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MCByMWMyLXQ0MCI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmciIGFsdD0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgdGl0bGU9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NDAgcjFjMi10NDAiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4gZW50aXR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyIgYWx0PSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiB0aXRsZT0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0MCByMWMyLXQ0MCI+PGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0MCByMWMyLXQ0MCI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NDAgcjFjMi10NDAiPkJhc2ljIGNvbGxlY3Rpb24gbWFwcGluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0MCByMWMyLXQ0MCI+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OTdiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5MTk5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JCRElCIiBuYW1lPSJDQUNCQkRJQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjgzIiBuYW1lPSJzdGhyZWYyODMiPjwvYT48YSBpZD0ic3RocmVmMjg0IiBuYW1lPSJzdGhyZWYyODQiPjwvYT48YSBpZD0ic3RocmVmMjg1IiBuYW1lPSJzdGhyZWYyODUiPjwvYT5BZGRpdGlvbmFsIERhbGkgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb25saW5lIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9EYWxpX0RldmVsb3Blcl9Eb2N1bWVudGF0aW9uIj5odHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbjwvYT48L2NvZGU+PC9wPgotPHA+VGhpcyBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dDo8L3A+Ci08dWw+Ci08bGk+Ci08cD5EYWxpIGFyY2hpdGVjdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QbHVnaW5zIHRoYXQgY29tcHJpc2UgdGhlIERhbGkgSlBBIEVjbGlwc2UgZmVhdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FeHRlbnNpb24gcG9pbnRzPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3Zjk2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY1IiBuYW1lPSJzdGhyZWY2NSI+PC9hPjxhIGlkPSJzdGhyZWY2NiIgbmFtZT0ic3RocmVmNjYiPjwvYT48YSBpZD0ic3RocmVmNjciIG5hbWU9InN0aHJlZjY3Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViOWQyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdCSUVJIiBuYW1lPSJDSUhHQklFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvaDE+Ci08cD5BZGQgYSBzZWNvbmRhcnkgdGFibGUgYW5ub3RhdGlvbiB0byBhbiBlbnRpdHkgaWYgaXRzIGRhdGEgaXMgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgdGFibGUuPC9wPgotPHA+VG8gYWRkIGEgc2Vjb25kYXJ5IHRhYmxlIHRvIHRoZSBlbnRpdHksPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg0YTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY4NmUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTVhMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQ0NDSkQiIG5hbWU9IkNJSENDQ0pEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmOTEiIG5hbWU9InN0aHJlZjkxIj48L2E+PGEgaWQ9InN0aHJlZjkyIiBuYW1lPSJzdGhyZWY5MiI+PC9hPkFuIGVudGl0eSBtYXkgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZW50aXRpZXMuIFlvdSBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHN0cmF0ZWd5IHRvIHVzZSBmb3IgaW5oZXJpdGFuY2UuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgKDxjb2RlPkBJbmhlcml0YW5jZSk8L2NvZGU+IGZvciBhbiBleGlzdGluZyBlbnRpdHkgKDxjb2RlPkBFbnRpdHk8L2NvZGU+KTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SW5oZXJpdGFuY2U8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3RhYi5wbmciIGFsdD0iU2VsZWN0aW5nIHRoZSBJbmhlcml0YW5jZSBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiBsaXN0LCBzZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+QSBzaW5nbGUgdGFibGUgKGRlZmF1bHQpPC9wPgotPC9saT4KLTxsaT4KLTxwPkpvaW5lZCB0YWJsZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUgdGFibGUgcGVyIGNsYXNzPC9wPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBmb2xsb3dpbmcgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIHRhYi4gU2VlIDxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDRkhHSEUiPiJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI8L2E+IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJzdGhyZWY5NCIgbmFtZT0ic3RocmVmOTQiPjwvYT48YSBpZD0ic3RocmVmOTUiIG5hbWU9InN0aHJlZjk1Ij48L2E+RGlzY3JpbWluYXRvciBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMyLXQxMyI+TmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5TaW5nbGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luZWQ8L3NwYW4+IGluaGVyaXRhbmNlIHN0cmF0ZWd5LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QERpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkRpc2NyaW1pbmF0b3IgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj5TZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byA8Y29kZT5DaGFyPC9jb2RlPiBvciA8Y29kZT5JbnRlZ2VyPC9jb2RlPiAoaW5zdGVhZCBvZiBpdHMgZGVmYXVsdDogPGNvZGU+U3RyaW5nPC9jb2RlPikuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBWYWx1ZTwvc3Bhbj4gbXVzdCBjb25mb3JtIHRvIHRoaXMgdHlwZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMzLXQxMyI+U3RyaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9InN0aHJlZjk2IiBuYW1lPSJzdGhyZWY5NiI+PC9hPjxhIGlkPSJzdGhyZWY5NyIgbmFtZT0ic3RocmVmOTciPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QERpc2NyaW1pbmF0b3JWYWx1ZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+T3ZlcnJpZGUgRGVmYXVsdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5Vc2UgdGhpcyBmaWVsZCB0byBzcGVjaWZ5IGN1c3RvbSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AUHJpbWFyeUtleUpvaW5DbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHkgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5IRVJJVEFOQ0VfU1RSQVRFR1kmZ3Q7PC9zcGFuPikKLUBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX0NPTFVNTiZndDs8L3NwYW4+IiwKLSAgICBkaXNjcmltaW5hdG9yVHlwZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9UWVBFJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvclZhbHVlKHZhbHVlLSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9WQUxVRSZndDs8L3NwYW4+IikKLUBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgCi0gICAgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1JFRkVSRU5DRURfQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIpCi0KLTwvcHJlPgotPHA+PGEgaWQ9InN0aHJlZjk4IiBuYW1lPSJzdGhyZWY5OCI+PC9hPjxhIGlkPSJzdGhyZWY5OSIgbmFtZT0ic3RocmVmOTkiPjwvYT48YSBpZD0ic3RocmVmMTAwIiBuYW1lPSJzdGhyZWYxMDAiPjwvYT5UaGUgZm9sbG93aW5nIGZpZ3VyZXMgaWxsdXN0cmF0ZXMgdGhlIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVnaWVzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwMSIgbmFtZT0ic3RocmVmMTAxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBlbnRpdHkgaW5oZXJpdGFuY2UgaW4gYSBzaW5nbGUgdGFibGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwMiIgbmFtZT0ic3RocmVmMTAyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwMyIgbmFtZT0ic3RocmVmMTAzIj48L2E+PGEgaWQ9InN0aHJlZjEwNCIgbmFtZT0ic3RocmVmMTA0Ij48L2E+Sm9pbmVkIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9qb2luLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2Vfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI1YjJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIREdEQ0QiIG5hbWU9IkNJSERHRENEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmNTYiIG5hbWU9InN0aHJlZjU2Ij48L2E+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvaDE+Ci08cD5XaGVuIGNyZWF0aW5nIGEgSlBBIHByb2plY3QsIChzZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPikgeW91IGNhbiBhbHNvIGNyZWF0ZSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0aGF0IGRlZmluZXMgdGhlIG1hcHBpbmcgbWV0YWRhdGEgYW5kIGRlZmF1bHRzLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY1NyIgbmFtZT0ic3RocmVmNTciPjwvYT5FY2xpcHNlIGNyZWF0ZXMgdGhlIDxjb2RlPk1FVEEtSU5GXG9ybS54bWw8L2NvZGU+IGZpbGUgaW4geW91ciBwcm9qZWN0J3MgZGlyZWN0b3J5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7cGVyc2lzdGVuY2UgdmVyc2lvbj0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1ZFUlNJT04mZ3Q7PC9zcGFuPiIKLSAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIiZndDsKLSAgJmx0O3BlcnNpc3RlbmNlLXVuaXQgbmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1VOSVRfTkFNRSZndDs8L3NwYW4+IiZndDsKLSAgICAmbHQ7cHJvdmlkZXI9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9QUk9WSURFUiZndDs8L3NwYW4+IiAvJmd0OwotICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQmZ3Q7Ci0mbHQ7L3BlcnNpc3RlbmNlJmd0OwotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIj5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDA0Lmh0bSNDSUhCQ0RDRSI+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2MWE4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhEQUpJRCIgbmFtZT0iQ0lIREFKSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY0NyIgbmFtZT0ic3RocmVmNDciPjwvYT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjQ4IiBuYW1lPSJzdGhyZWY0OCI+PC9hPldoZW4geW91IGNyZWF0ZSBhIHByb2plY3QsIEVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZccGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBwcm9qZWN0J3MgZGlyZWN0b3J5LjwvcD4KLTxwPllvdSBjYW4gY3JlYXRlIGEgc3R1YiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pLiBZb3UgY2FuIG1hbmFnZSB0aGlzIGZpbGUgZWl0aGVyIHRocm91Z2ggdGhlIFhNTCBlZGl0b3IgKHNlZSApIG9yIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotRGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgRWNsaXBzZUxpbmspLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFnZXMgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcjoKLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2hhbmdlLXRyYWNraW5nIGFuZCBzZXNzaW9uIGN1c3RvbWl6ZXItcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNhY2hpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBsb2dnaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgc2Vzc2lvbiBhbmQgdGFyZ2V0IGRhdGFiYXNlIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIERETC1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIEpQQSBpbXBsZW1lbnRhdGlvbiwgdGhlIENvbm5lY3Rpb25zIHBhZ2UgYWxzbyBpbmNsdWRlcyBKREJDIGNvbm5lY3Rpb24gcG9vbCBwcm9wZXJ0aWVzLjwvcD4KLTxwPklmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZW4gb25seSB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiwgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4sIDxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+IGFuZCA8YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+IHBhZ2VzIGFyZSBhdmFpbGFibGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5UbyB1c2UgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gRWRpdG9yOjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIDxjb2RlPnBlcmlzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiBwYWdlIG9mIHRoZSBlZGl0b3IgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhbDwvc3Bhbj4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZXMgPGNvZGU+Jmx0O3BlcnNpc3RlbnQtdW5pdCZndDs8L2NvZGU+LXJlbGF0ZWQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIChkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IncyBTb3VyY2UgcGFnZSBlbmFibGVzIHlvdSB0byB2aWV3IGFuZCBlZGl0IHRoZSByYXcgWE1MIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGVkaXRvci4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RWxlbWVudCBEZWZpbmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWUgPSAiJmx0O05hbWUmZ3Q7IiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY0OSIgbmFtZT0ic3RocmVmNDkiPjwvYT5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+RGVzY3JpcHRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY1MCIgbmFtZT0ic3RocmVmNTAiPjwvYT5NYW5hZ2VkIENsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Jm5ic3A7Jm5ic3A7RXhjbHVkZSZuYnNwO1VubGlzdGVkJm5ic3A7Q2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5YTUwmbmJzcDtNYXBwaW5nJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIGRlZmluZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10OCIgaGVhZGVycz0icjFjMS10OCI+SkFSJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgYWRkaXRpb25hbCBKQVIgZmlsZXMgYW5kIGxpYnJhcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMy10OCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+IHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT4mbHQ7anRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtub24tanRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+Ci08cD5UbyBjb25maWd1cmUgdGhlIEpUQSAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIHNvdXJjZSB1c2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlcjo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyBjb25maWd1cmUgYSBub24tSlRBIGRhdGEgc291cmNlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0KCk8L3NwYW4+IHRvIHVzZSB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+PGEgaWQ9InN0aHJlZjUxIiBuYW1lPSJzdGhyZWY1MSI+PC9hPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgeW91IGNhbiBhbHNvIGRlZmluZSB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgVVJMLCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIHRhYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2V0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTxwPlRvIGFkZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08b2w+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIDxjb2RlPiZsdDtuYW1lJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHVzaW5nIHRoZSB0YWJsZSdzIE5hbWUgYW5kIFZhbHVlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIHJlbW92ZSBhIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQsIHNlbGVjdCBhIGRlZmluZWQgcHJvcGVydHkgaW4gdGhlIHRhYmxlIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZW1vdmU8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHByb2plY3QgdXNlcyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBjb25uZWN0aW9uIHBhZ2UgYWxzbyBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciBKREJDIGNvbm5lY3Rpb24gcG9vbGluZy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiPlN5bmNocm9uaXppbmcgY2xhc3NlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmQ2MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgYW4gZW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwaW5nIGFuIGVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRHQklKIiBuYW1lPSJCQUJER0JJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5NYXBwaW5nIGFuIGVudGl0eTwvaDE+Ci08cD5EYWxpIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyB0eXBlcyBmb3IgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCSEZIRUkiPlRyYW5zaWVudCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxOC5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkFkZGl0aW9uYWwgbWFwcGluZyB0eXBlcyAoc3VjaCBhcyBCYXNpYyBDb2xsZWN0aW9uIG1hcHBpbmdzKSBtYXkgYmUgYXZhaWxhYmxlIHdoZW4gdXNpbmcgRGFsaSB3aXRoIEVjbGlwc2VMaW5rLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+IDwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0NjBiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYXNrczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRhc2tzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjUiIG5hbWU9InN0aHJlZjI1Ij48L2E+PC9wPgotPGgxPlRhc2tzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBkZXRhaWxlZCBzdGVwLWJ5LXN0ZXAgcHJvY2VkdXJlcyBmb3IgYWNjZXNzaW5nIHRoZSBEYWxpIE9SIG1hcHBpbmcgdG9vbCBmdW5jdGlvbmFsaXR5LjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDAxLmh0bSNCRUlCQURISCI+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCRkFJQkEiPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjQuaHRtI0JBQkRCQ0JJIj5Nb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYmU3ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCRUlCQURISCIgbmFtZT0iQkVJQkFESEgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdDwvaDE+Ci08cD48YSBpZD0ic3RocmVmMzUiIG5hbWU9InN0aHJlZjM1Ij48L2E+PGEgaWQ9InN0aHJlZjM2IiBuYW1lPSJzdGhyZWYzNiI+PC9hPjxhIGlkPSJzdGhyZWYzNyIgbmFtZT0ic3RocmVmMzciPjwvYT5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY29udmVydCBhbiBleGlzdGluZyBKYXZhIHByb2plY3QgdG8gYSBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBleHBsb3JlciwgcmlnaHQtY2xpY2sgdGhlIEphdmEgcHJvamVjdCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSAmZ3Q7IENvbnZlcnQgdG8gSlBBIFByb2plY3QuPC9zcGFuPiBUaGUgUHJvamVjdCBGYWNldHMgcGFnZSBvZiB0aGUgTW9kaWZ5IEZhY2V0ZWQgUHJvamVjdCB3aXphcmQgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOCIgbmFtZT0ic3RocmVmMzgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5Nb2RpZnkgRmFjZXRlZCBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyYXRpb248L3NwYW4+IHRvIDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0IEpQQSBDb25maWd1cmF0aW9uPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzkiIG5hbWU9InN0aHJlZjM5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIEZhY2V0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgeW91ciBKUEEgdXNlciBsaWJyYXJpZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIG9idGFpbiBhZGRpdGlvbmFsIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMuPC9wPgotPHA+SWYgRGFsaSBkZXJpdmVzIHRoZSBpbmNvcnJlY3Qgc2NoZW1hLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4uIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3A+Ci08cD5JZiB5b3UgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uICh3aGljaCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0KSwgeW91IGNhbiBsYXRlciBhZGQgYSBtYXBwaW5nIGZpbGUgdG8gdGhlIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBhZGRzIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyaWVzIHRvIHlvdXIgcHJvamVjdCBhbmQgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IDxjb2RlPm9ybS54bWw8L2NvZGU+IGFuZCA8Y29kZT5wZXJpc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhNDI0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEZFQkFJIiBuYW1lPSJDSUhGRUJBSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3luY2hyb25pemluZyBjbGFzc2VzPC9oMT4KLTxwPkFzIHlvdSB3b3JrIHdpdGggdGhlIGNsYXNzZXMgaW4geW91ciBKYXZhIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcy4gPGEgaWQ9InN0aHJlZjUyIiBuYW1lPSJzdGhyZWY1MiI+PC9hPjxhIGlkPSJzdGhyZWY1MyIgbmFtZT0ic3RocmVmNTMiPjwvYT48YSBpZD0ic3RocmVmNTQiIG5hbWU9InN0aHJlZjU0Ij48L2E+PC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHN5bmNocm9uaXplIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzcyBMaXN0PC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+QW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBvcHRpb248L3NwYW4+IGluIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LiBJbiBnZW5lcmFsLCB5b3UgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250YWluZXIuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY1NSIgbmFtZT0ic3RocmVmNTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TeW5jaHJvbml6aW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgRmlsZTwvcD4KLTxpbWcgc3JjPSJpbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RGFsaSBhZGRzIHRoZSBuZWNlc3NhcnkgPGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGVyc2lzdGVuY2UgWE1MIEVkaXRvcjwvc3Bhbj4gdG8gY29udGludWUgZWRpdGluZyB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJmYjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWY1OCIgbmFtZT0ic3RocmVmNTgiPjwvYT4KLTxoMT5DcmVhdGluZyBhbiBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjU5IiBuYW1lPSJzdGhyZWY1OSI+PC9hPklmIHlvdSBvcHQgbm90IHRvIGNyZWF0ZSBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHdoZW4geW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LCB5b3UgY2FuIGNyZWF0ZSBvbmUgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjYwIiBuYW1lPSJzdGhyZWY2MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBTZWxlY3QgYSBXaXphcmQgRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBNYXBwaW5nIGZpbGUgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBNYXBwaW5nIGZpbGUgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwaW5nIEZpbGU8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIE1hcHBpbmcgRmlsZSBwYWdlIGFwcGVhcnMuPC9wPgotPHA+SWYgeW91IGFyZSB1c2luZyBFY2xpcHNlTGluaywgeW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVjbGlwc2VMaW5rICZndDsgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2MSIgbmFtZT0ic3RocmVmNjEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBGaWxlIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIEZpbGUgcGFnZS4iIHRpdGxlPSJUaGUgTWFwcGluZyBGaWxlIHBhZ2UuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+RGVmaW5lIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gVGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgYXBwZWFycyBpbiB0aGUgc3JjIGRpcmVjdG9yeSBvZiB0aGUgc2VsZWN0ZWQgSlBBIHByb2plY3QuIFlvdSBjYW4gbWFuYWdlIHRoZSBvcm0ueG1sIGZpbGUgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcgb3IgdGhyb3VnaCB0aGUgWE1MIEVkaXRvci4gU2VlIGFsc28gPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJmNmJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCQ0RDRSIgbmFtZT0iQ0lIQkNEQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjYyIiBuYW1lPSJzdGhyZWY2MiI+PC9hPjxhIGlkPSJzdGhyZWY2MyIgbmFtZT0ic3RocmVmNjMiPjwvYT5Zb3UgY2FuIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5PcGVuPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHlNYXBwaW5nczwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjb25maWd1cmUgdGhlIGVudGl0eSBtYXBwaW5nIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjY0IiBuYW1lPSJzdGhyZWY2NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIHZpZXcgZm9yIEVudGl0eU1hcHBpbmdzIChvcm0ueG1sKTwvcD4KLTxpbWcgc3JjPSJpbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmciIGFsdD0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgdGl0bGU9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjxiciAvPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCI+V29ya2luZyB3aXRoIFhNTCBGaWxlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NDZmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkdCSUVFIiBuYW1lPSJCQUJHQklFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW50aXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT48YSBpZD0ic3RocmVmNjkiIG5hbWU9InN0aHJlZjY5Ij48L2E+PGEgaWQ9InN0aHJlZjcwIiBuYW1lPSJzdGhyZWY3MCI+PC9hPjxhIGlkPSJzdGhyZWY3MSIgbmFtZT0ic3RocmVmNzEiPjwvYT5BbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBpcyBhIHBlcnNpc3RlbnQgZG9tYWluIG9iamVjdC48L3A+Ci08cD5BbiBlbnRpdHkgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2FuIGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BYnN0cmFjdCBvciBjb25jcmV0ZSBjbGFzc2VzLiBFbnRpdGllcyBtYXkgYWxzbyBleHRlbmQgbm9uLWVudGl0eSBjbGFzc2VzIGFzIHdlbGwgYXMgZW50aXR5IGNsYXNzZXMsIGFuZCBub24tZW50aXR5IGNsYXNzZXMgbWF5IGV4dGVuZCBlbnRpdHkgY2xhc3Nlcy48L3A+Ci08L2xpPgotPC91bD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5tdXN0IGhhdmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkEgbm8tYXJnIGNvbnN0cnVjdG9yIChwdWJsaWMgb3IgcHJvdGVjdGVkKTsgdGhlIGVudGl0eSBjbGFzcyBtYXkgaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgYXMgd2VsbC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxhIGlkPSJzdGhyZWY3MiIgbmFtZT0ic3RocmVmNzIiPjwvYT48YSBpZD0ic3RocmVmNzMiIG5hbWU9InN0aHJlZjczIj48L2E+PGEgaWQ9InN0aHJlZjc0IiBuYW1lPSJzdGhyZWY3NCI+PC9hPkVhY2ggcGVyc2lzdGVudCBlbnRpdHkgbXVzdCBiZSBtYXBwZWQgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29udGFpbiBhIHByaW1hcnkga2V5LiBQZXJzaXN0ZW50IGVudGl0aWVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyLjwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gYWNjZXNzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gSW4gdGhlIGZvbGxvd2luZyBmaWd1cmUsIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmVudGl0eTwvc3Bhbj4gaW52b2tlcyB0aGUgZGlhbG9nIGZyb20gdGhlIEpQQSBEZXRhaWxzIFZpZXcuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzUiIG5hbWU9InN0aHJlZjc1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIGFuIGVudGl0eSBzaG93aW5nIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gY2hhbmdlIChvciBhZGQpIHBlcnNpc3RlbmNlIGZvciBhbiBlbnRpdHkgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcgYW5kIHRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEVudGl0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBmcm9tIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjc2IiBuYW1lPSJzdGhyZWY3NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5OTFhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbWJlZGRhYmxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRhYmxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkVJQ0UiIG5hbWU9IkJBQkZFSUNFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRhYmxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY3NyIgbmFtZT0ic3RocmVmNzciPjwvYT48YSBpZD0ic3RocmVmNzgiIG5hbWU9InN0aHJlZjc4Ij48L2E+QW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPiBjbGFzcyBpcyBhIGNsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgc3RvcmVkIGFzIHBhcnQgb2YgYW4gb3duaW5nIGVudGl0eTsgaXQgc2hhcmVzIHRoZSBpZGVudGl0eSBvZiB0aGUgb3duaW5nIGVudGl0eS4gRWFjaCBmaWVsZCBvZiB0aGUgZW1iZWRkZWQgY2xhc3MgaXMgbWFwcGVkIHRvIHRoZSBkYXRhYmFzZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG93bmluZyBlbnRpdHkuPC9wPgotPHA+VG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgc3ViY2xhc3MsIHVzZSB0aGUgPGNvZGU+QEF0dHJpYnV0ZU92ZXJyaWRlPC9jb2RlPiBhbm5vdGF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGNsYXNzLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY3OSIgbmFtZT0ic3RocmVmNzkiPjwvYT48YSBpZD0ic3RocmVmODAiIG5hbWU9InN0aHJlZjgwIj48L2E+PGEgaWQ9InN0aHJlZjgxIiBuYW1lPSJzdGhyZWY4MSI+PC9hPkFuIGVtYmVkZGFibGUgZW50aXR5IGlzIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbWJlZGRhYmxlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgZW1iZWRkYWJsZSBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rIHRvIG9wZW4gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGFibGU8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmODIiIG5hbWU9InN0aHJlZjgyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+TWFwcGluZyBUeXBlIFNlbGVjdGlvbiBEaWFsb2cgKEVtYmVkZGFibGUpPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZyIgYWx0PSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBFbWJlZGRhYmxlIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVtYmVkZGFibGUgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08ZGw+Ci08ZGQ+PGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48L2RkPgotPGRkPjxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PC9kZD4KLTxkZD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9kZD4KLTwvZGw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzYTNjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwZWQgc3VwZXJjbGFzczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGVkIHN1cGVyY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQUdDSSIgbmFtZT0iQkFCREFHQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBlZCBzdXBlcmNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT48YSBpZD0ic3RocmVmODQiIG5hbWU9InN0aHJlZjg0Ij48L2E+QW4gZW50aXR5IHRoYXQgZXh0ZW5kcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gY2xhc3MgaW5oZXJpdHMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgYW5kIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHN1cGVyY2xhc3MuIFlvdSBzaG91bGQgdXNlIGEgbWFwcGVkIHN1cGVyY2xhc3MgdG8gZGVmaW5lIG1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21tb24gdG8gbXVsdGlwbGUgZW50aXR5IGNsYXNzZXMuPC9wPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXM8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2Fubm90IGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5CZSBxdWVyaWVkIG9yIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBFbnRpdHktTWFuYWdlciBvciBRdWVyeSBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPkJlIHRoZSB0YXJnZXQgb2YgYSBwZXJzaXN0ZW50IHJlbGF0aW9uc2hpcDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSB0YWJsZS4gSW5zdGVhZCwgaXRzIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiBUbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjg1IiBuYW1lPSJzdGhyZWY4NSI+PC9hPjxhIGlkPSJzdGhyZWY4NiIgbmFtZT0ic3RocmVmODYiPjwvYT48YSBpZD0ic3RocmVmODciIG5hbWU9InN0aHJlZjg3Ij48L2E+PGEgaWQ9InN0aHJlZjg4IiBuYW1lPSJzdGhyZWY4OCI+PC9hPkEgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QE1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBNYXBwZWQgU3VwZXJjbGFzcyBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY4OSIgbmFtZT0ic3RocmVmODkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoTWFwcGVkIFN1cGVyY2xhc3MpPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNmVkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUdCR0ciIG5hbWU9IkJBQklHQkdHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMDUiIG5hbWU9InN0aHJlZjEwNSI+PC9hPjxhIGlkPSJzdGhyZWYxMDYiIG5hbWU9InN0aHJlZjEwNiI+PC9hPk5hbWVkIHF1ZXJpZXMgaW1wcm92ZSBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBiZWNhdXNlIHRoZXkgYXJlIHByZXBhcmVkIG9uY2UgYW5kIHRoZXkgKGFuZCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBzdXBwb3J0aW5nIG9iamVjdHMpIGNhbiBiZSBlZmZpY2llbnRseSByZXVzZWQgdGhlcmVhZnRlciwgbWFraW5nIHRoZW0gd2VsbCBzdWl0ZWQgZm9yIGNvbXBsZXggYW5kIGZyZXF1ZW50bHkgZXhlY3V0ZWQgb3BlcmF0aW9ucy4gTmFtZWQgcXVlcmllcyB1c2UgdGhlIEpQQSBxdWVyeSBsYW5ndWFnZSBmb3IgcG9ydGFibGUgZXhlY3V0aW9uIG9uIGFueSB1bmRlcmx5aW5nIGRhdGFiYXNlOyBuYW1lZCBuYXRpdmUgcXVlcmllcyB1c2UgdGhlIFNRTCBsYW5ndWFnZSBuYXRpdmUgdG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCA8Y29kZT5ATmFtZWRRdWVyeTwvY29kZT4gYW5kIDxjb2RlPkBOYW1lZE5hdGl2ZVF1ZXJ5PC9jb2RlPiBhbm5vdGF0aW9ucyB0byB0aGUgZW50aXR5LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5hbWVkIHF1ZXJ5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgZW50aXR5IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgZXhwYW5kIFF1ZXJpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IGZvciBhIG5hbWVkIHF1ZXJ5LCBvciA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIE5hdGl2ZTwvc3Bhbj4gZm9yIGEgbmF0aXZlIHF1ZXJ5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgZGlhbG9nIHRoYXQgYXBwZWFycywgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGluIHRoZSBOYW1lIGZpZWxkIGFuZCB0aGVuIGNsaWNrIE9LLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgcXVlcnkgaW4gdGhlIFF1ZXJ5IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBpZD0ic3RocmVmMTA3IiBuYW1lPSJzdGhyZWYxMDciPjwvYT48YSBpZD0ic3RocmVmMTA4IiBuYW1lPSJzdGhyZWYxMDgiPjwvYT48YSBpZD0ic3RocmVmMTA5IiBuYW1lPSJzdGhyZWYxMDkiPjwvYT48YSBpZD0ic3RocmVmMTEwIiBuYW1lPSJzdGhyZWYxMTAiPjwvYT5UbyBhZGQgYSBRdWVyeSBoaW50LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkVudGVyaW5nIGEgTmFtZWQgUXVlcnk8L3A+Ci08aW1nIHNyYz0iaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nIiBhbHQ9IlRoZSBRdWVyaWVzIHNlY3Rpb24gb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmZkYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkJhc2ljIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkJhc2ljIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCQUJDRSIgbmFtZT0iQkFCQkFCQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkJhc2ljIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExMiIgbmFtZT0ic3RocmVmMTEyIj48L2E+PGEgaWQ9InN0aHJlZjExMyIgbmFtZT0ic3RocmVmMTEzIj48L2E+PGEgaWQ9InN0aHJlZjExNCIgbmFtZT0ic3RocmVmMTE0Ij48L2E+PGEgaWQ9InN0aHJlZjExNSIgbmFtZT0ic3RocmVmMTE1Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljIE1hcHBpbmc8L3NwYW4+IHRvIG1hcCBhbiBhdHRyaWJ1dGUgZGlyZWN0bHkgdG8gYSBkYXRhYmFzZSBjb2x1bW4uIEJhc2ljIG1hcHBpbmdzIG1heSBiZSB1c2VkIG9ubHkgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5KYXZhIHByaW1pdGl2ZSB0eXBlcyBhbmQgd3JhcHBlcnMgb2YgdGhlIHByaW1pdGl2ZSB0eXBlczwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nLCBqYXZhLm1hdGguQmlnSW50ZWdlcjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5tYXRoLkJpZ0RlY2ltYWw8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEudXRpbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnV0aWwuQ2FsZW5kYXIsIGphdmEuc3FsLkRhdGU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Ynl0ZVtdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5CeXRlW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmNoYXJbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Q2hhcmFjdGVyW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPmVudW1zPC9wPgotPC9saT4KLTxsaT4KLTxwPmFueSBvdGhlciB0eXBlIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5TZXJpYWxpemFibGU8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UbyBjcmVhdGUgYSBiYXNpYyBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHJpZ2h0LWNsaWNrIHRoZSBmaWVsZCB0byBtYXAuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgQmFzaWM8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iNDElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkVudGl0eSBNYXAgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMi10MTQiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljIE1hcHBpbmc8L3NwYW4+LgotPHA+VGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEJhc2ljPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzMtdDE0Ij5CYXNpYzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzItdDE0Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMy10MTQiPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlIGFuZCBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPklOU0VSVDwvY29kZT4gYW5kIDxjb2RlPlVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzItdDE0Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMyLXQxNCI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE0IHIxYzMtdDE0Ij5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTQgcjFjMi10MTQiPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE0IHIxYzMtdDE0Ij5ZZXM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5UeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTQgcjFjMi10MTQiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhOgotPHVsPgotPGxpPgotPHA+RGVmYXVsdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MT0IgJm5kYXNoOyBTcGVjaWZpZXMgaWYgdGhpcyBpcyBhIGxhcmdlIG9iamVjdHMgKEJMT0Igb3IgQ0xPQikuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCQklCSSI+IkxvYiI8L2E+IGZvciBkZXRhaWxzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UZW1wb3JhbCAmbmRhc2g7IFNwZWNpZnkgaWYgdGhpcyBpcyBhIERhdGUsIFRpbWUsIG9yIFRpbWVzdGFtcCBvYmplY3QuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudW1lcmF0ZWQgJm5kYXNoOyBTcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgYXMgb3JkaW5hbCBvciBzdHJpbmcsIGluIG9yZGVyIHRvIG1hdGNoIGFuIGV4aXN0aW5nIGRhdGFiYXNlIHNjaGVtYS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9UQUJMRSZndDs8L3NwYW4+IiwgCi0gICAgaW5zZXJ0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5TRVJUQUJMRSZndDs8L3NwYW4+LCB1cGRhdGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotQEJhc2ljKGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBvcHRpb25hbCA9IDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUFRJT05BTCZndDs8L3NwYW4+KQotQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyOWViYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbWJlZGRlZCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0JIREYiIG5hbWU9IkJBQkNCSERGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTYiIG5hbWU9InN0aHJlZjExNiI+PC9hPjxhIGlkPSJzdGhyZWYxMTciIG5hbWU9InN0aHJlZjExNyI+PC9hPjxhIGlkPSJzdGhyZWYxMTgiIG5hbWU9InN0aHJlZjExOCI+PC9hPjxhIGlkPSJzdGhyZWYxMTkiIG5hbWU9InN0aHJlZjExOSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSBhIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgb2YgYW4gZW50aXR5IHdob3NlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGFuIGVtYmVkZGFibGUgY2xhc3MuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBFbWJlZGRlZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMi10MTUiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+RW1iZWRkZWQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBlbnRpdHkncyBhdHRyaWJ1dGUuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWEyNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERJQUVFIiBuYW1lPSJDSUhESUFFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgSUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTIwIiBuYW1lPSJzdGhyZWYxMjAiPjwvYT48YSBpZD0ic3RocmVmMTIxIiBuYW1lPSJzdGhyZWYxMjEiPjwvYT48YSBpZD0ic3RocmVmMTIyIiBuYW1lPSJzdGhyZWYxMjIiPjwvYT48YSBpZD0ic3RocmVmMTIzIiBuYW1lPSJzdGhyZWYxMjMiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElEIE1hcHBpbmc8L3NwYW4+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZkMjFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JRCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0NCSEciIG5hbWU9IkJBQkdDQkhHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5JRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPjxhIGlkPSJzdGhyZWYxMjYiIG5hbWU9InN0aHJlZjEyNiI+PC9hPjxhIGlkPSJzdGhyZWYxMjciIG5hbWU9InN0aHJlZjEyNyI+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNTc1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUlFR0QiIG5hbWU9IkJBQkVJRUdEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTI4IiBuYW1lPSJzdGhyZWYxMjgiPjwvYT48YSBpZD0ic3RocmVmMTI5IiBuYW1lPSJzdGhyZWYxMjkiPjwvYT48YSBpZD0ic3RocmVmMTMwIiBuYW1lPSJzdGhyZWYxMzAiPjwvYT48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3NjBkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFueS10by1vbmUgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGQUZKIiBuYW1lPSJCQUJIRkFGSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFueS10by1vbmUgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT48YSBpZD0ic3RocmVmMTM0IiBuYW1lPSJzdGhyZWYxMzQiPjwvYT48YSBpZD0ic3RocmVmMTM1IiBuYW1lPSJzdGhyZWYxMzUiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+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+PGEgaWQ9InN0aHJlZjEzNiIgbmFtZT0ic3RocmVmMTM2Ij48L2E+PGEgaWQ9InN0aHJlZjEzNyIgbmFtZT0ic3RocmVmMTM3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMy10MjIiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIpCi1ATWFueVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBmZXRjaD08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBjYXNjYWRlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YmRkZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9uZS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9uZS10by1tYW55IG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJIR0VCRCIgbmFtZT0iQkFCSEdFQkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk9uZS10by1tYW55IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEzOCIgbmFtZT0ic3RocmVmMTM4Ij48L2E+PGEgaWQ9InN0aHJlZjEzOSIgbmFtZT0ic3RocmVmMTM5Ij48L2E+PGEgaWQ9InN0aHJlZjE0MCIgbmFtZT0ic3RocmVmMTQwIj48L2E+PGEgaWQ9InN0aHJlZjE0MSIgbmFtZT0ic3RocmVmMTQxIj48L2E+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTdhODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9uZS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0MiIgbmFtZT0ic3RocmVmMTQyIj48L2E+PGEgaWQ9InN0aHJlZjE0MyIgbmFtZT0ic3RocmVmMTQzIj48L2E+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+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+PGEgaWQ9InN0aHJlZjE0NiIgbmFtZT0ic3RocmVmMTQ2Ij48L2E+PGEgaWQ9InN0aHJlZjE0NyIgbmFtZT0ic3RocmVmMTQ3Ij48L2E+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDAwNjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRyYW5zaWVudCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUcmFuc2llbnQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGSEVJIiBuYW1lPSJCQUJIRkhFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VHJhbnNpZW50IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0OCIgbmFtZT0ic3RocmVmMTQ4Ij48L2E+PGEgaWQ9InN0aHJlZjE0OSIgbmFtZT0ic3RocmVmMTQ5Ij48L2E+PGEgaWQ9InN0aHJlZjE1MCIgbmFtZT0ic3RocmVmMTUwIj48L2E+PGEgaWQ9InN0aHJlZjE1MSIgbmFtZT0ic3RocmVmMTUxIj48L2E+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+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNiN2FiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5WZXJzaW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZlcnNpb24gbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhJQklJIiBuYW1lPSJCQUJISUJJSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VmVyc2lvbiBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNTIiIG5hbWU9InN0aHJlZjE1MiI+PC9hPjxhIGlkPSJzdGhyZWYxNTMiIG5hbWU9InN0aHJlZjE1MyI+PC9hPjxhIGlkPSJzdGhyZWYxNTQiIG5hbWU9InN0aHJlZjE1NCI+PC9hPjxhIGlkPSJzdGhyZWYxNTUiIG5hbWU9InN0aHJlZjE1NSI+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+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYmUxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFHRkkiIG5hbWU9IkJBQkJBR0ZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE1NiIgbmFtZT0ic3RocmVmMTU2Ij48L2E+PGEgaWQ9InN0aHJlZjE1NyIgbmFtZT0ic3RocmVmMTU3Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGdlbmVyYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBmcm9tIGRhdGFiYXNlIHRhYmxlcy4gWW91IG11c3QgY3JlYXRlIGEgSlBBIHByb2plY3QgYW5kIGVzdGFibGlzaCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gPHNwYW4gY2xhc3M9Iml0YWxpYyI+YmVmb3JlPC9zcGFuPiBnZW5lcmF0aW5nIHBlcnNpc3RlbnQgZW50aXRpZXMuIFNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjxhIGlkPSJzdGhyZWYxNTgiIG5hbWU9InN0aHJlZjE1OCI+PC9hPjxhIGlkPSJzdGhyZWYxNTkiIG5hbWU9InN0aHJlZjE1OSI+PC9hPjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlczwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYwIiBuYW1lPSJzdGhyZWYxNjAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5HZW5lcmF0aW5nIEVudGl0aWVzPC9wPgotPGltZyBzcmM9ImltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmciIGFsdD0iVXNpbmcgdGhlIEpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzIG1lbnUgb3B0aW9uLiIgdGl0bGU9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiPlNlbGVjdCBUYWJsZXM8L2E+IHBhZ2UsIHNlbGVjdCB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNjaGVtYS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgZGF0YWJhc2UgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBjb25uZWN0aW9uPC9zcGFuPi48L3A+Ci08cD5JZiB5b3UgYXJlIG5vdCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBkYXRhYmFzZSwgdGhlIERhdGFiYXNlIENvbm5lY3Rpb24gcGFnZSBhcHBlYXJzLiBTZWxlY3QgeW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+UmVjb25uZWN0PC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjEiIG5hbWU9InN0aHJlZjE2MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNlbGVjdCBUYWJsZXM8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF90YWJsZXMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIHNlbGVjdGluZyBhIHNjaGVtYSwgc2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiPlRhYmxlIEFzc29jaWF0aW9uczwvYT4gcGFnZSwgc2VsZWN0IHRoZSBhc3NvY2lhdGlvbnMgdG8gZ2VuZXJhdGUuIFlvdSBjYW4gc3BlY2lmeSB0byBnZW5lcmF0ZSBzcGVjaWZpYyByZWZlcmVuY2VzIGZvciBlYWNoIGFzc29jaWF0aW9uLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBBc3NvY2lhdGlvbjwvc3Bhbj4uIFVzZSB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT4gd2l6YXJkIHRvIGRlZmluZSB0aGUgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYyIiBuYW1lPSJzdGhyZWYxNjIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UYWJsZSBBc3NvY2lhdGlvbnM8L3A+Ci08aW1nIHNyYz0iaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgZWRpdGluZyB0aGUgdGFibGUgYXNzb2NpYXRpb25zLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI0NJQUVKREJFIj5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvYT4gcGFnZSwgY3VzdG9taXplIHRoZSBtYXBwaW5nIGFuZCBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBnZW5lcmF0ZWQgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2MyIgbmFtZT0ic3RocmVmMTYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L3A+Ci08aW1nIHNyYz0iaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBjdXN0b21pemluZyB0aGUgbWFwcGluZ3MsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9hPiBwYWdlLCByZXZpZXcgdGhlIG1hcHBpbmcgYW5kIGNsYXNzIGluZm9ybWF0aW9uIGZvciBlYWNoIGVudGl0eSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NCIgbmFtZT0ic3RocmVmMTY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L3A+Ci08aW1nIHNyYz0iaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBjcmVhdGVzIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSBmb3IgZWFjaCBkYXRhYmFzZSB0YWJsZS4gRWFjaCBlbnRpdHkgY29udGFpbnMgZmllbGRzIGJhc2VkIG9uIHRoZSB0YWJsZSdzIGNvbHVtbnMuIEVjbGlwc2Ugd2lsbCBhbHNvIGdlbmVyYXRlIGVudGl0eSByZWxhdGlvbnNoaXBzIChzdWNoIGFzIG9uZS10by1vbmUpIGJhc2VkIG9uIHRoZSB0YWJsZSBjb25zdHJhaW50cy4gPGEgaHJlZj0iI0NJSEpJSkpDIj5GaWd1cmU6IEdlbmVyYXRpbmcgRW50aXRpZXMgZnJvbSBUYWJsZXM8L2E+IGlsbHVzdHJhdGVzIGhvdyBFY2xpcHNlIGdlbmVyYXRlcyBlbnRpdGllcyBmcm9tIHRhYmxlcy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJDSUhKSUpKQyIgbmFtZT0iQ0lISklKSkMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5HZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9lbnRpdHkucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEVNUExPWUVFIGFuZCBBRERSRVNTIGVudGl0aWVzIGdlbmVyYXRlZCBmcm9tIGRhdGFiYXNlIHRhYmxlcy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0OWUyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISklHQkUiIG5hbWU9IkNJSEpJR0JFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC9oMT4KLTxwPldoZW4gdXNpbmcgYSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0sIHlvdSBjYW4gY3JlYXRlIGEgRERMIHNjcmlwdCBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBEREwgc2NyaXB0IHdpdGggRFJPUCBleGlzdGluZyB0YWJsZXMgb24gdGhlIGRhdGFiYXNlIGFuZCBDUkVBVEUgbmV3IHRhYmxlcywgYmFzZWQgb24gdGhlIGVudGl0aWVzIGluIHlvdXIgcHJvamVjdC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzAyZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUlCQSIgbmFtZT0iQkFCRkFJQkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNjUiIG5hbWU9InN0aHJlZjE2NSI+PC9hPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPjxhIGlkPSJzdGhyZWYxNjciIG5hbWU9InN0aHJlZjE2NyI+PC9hPjxhIGlkPSJzdGhyZWYxNjgiIG5hbWU9InN0aHJlZjE2OCI+PC9hPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwcGluZ3MgYXJlIGluZGljYXRlZCB3aXRoIGEgcmVkIGVycm9yIG9yIHllbGxvdyB3YXJuaW5nIG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzIHRoZSBwYXJlbnQgY29udGFpbmVycyB1cCB0byB0aGUgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjkiIG5hbWU9InN0aHJlZjE2OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNhbXBsZSBFcnJvcnMgYW5kIFdhcm5pbmdzPC9wPgotPGltZyBzcmM9ImltZy9lcnJvcl9zYW1wbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyBzYW1wbGUgZXJyb3IgYW5kIHdhcm5pbmcgaWNvbnMgaW4gdGhlIEV4cGxvcmVyIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIyLmh0bSNDSUhGRURFSSI+RXJyb3IgbWVzc2FnZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIzLmh0bSNDSUhHRUFJSiI+V2FybmluZyBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjMxNWU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFcnJvciBtZXNzYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEZFREVJIiBuYW1lPSJDSUhGRURFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RXJyb3IgbWVzc2FnZXM8YSBpZD0ic3RocmVmMTcwIiBuYW1lPSJzdGhyZWYxNzAiPjwvYT48L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGVycm9yIG1lc3NhZ2VzIChpbmNsdWRpbmcgaG93IHRvIHJlc29sdmUgdGhlIGlzc3VlKSB5b3UgbWF5IGVuY291bnRlciB3aGlsZSB3b3JraW5nIHdpdGggRGFsaS48L3A+Ci08YSBpZD0ic3RocmVmMTcxIiBuYW1lPSJzdGhyZWYxNzEiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QXR0cmlidXRlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7QVRUUklCVVRFX19OQU1FJmd0Ozwvc3Bhbj4iIGhhcyBpbnZhbGlkIG1hcHBpbmcgdHlwZSBpbiB0aGlzIGNvbnRleHQ8L3A+Ci08cD5UaGUgbWFwcGVkIGF0dHJpYnV0ZSBpcyBpbnZhbGlkLiBFaXRoZXIgY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUgb3IgY2hhbmdlIHRoZSBlbnRpdHkgdHlwZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+Ik1hcHBpbmcgYW4gZW50aXR5IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5EYWxpIGNhbm5vdCBtYXAgdGhlIGF0dHJpYnV0ZSB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb2x1bW4uIFZlcmlmeSB0aGF0IHlvdSBkYXRhYmFzZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGlzIGNvcnJlY3QuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNsYXNzICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0xBU1NfTkFNRSZndDs8L3NwYW4+IiBpcyBub3QgYW5ub3RhdGVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy48L3A+Ci08cD5UaGUgY2xhc3MgaGFzIG5vdCBiZWVuIGlkZW50aWZpZWQgYXMgYSBwZXJzaXN0ZW50IGNsYXNzLiBDb25maWd1cmUgdGhlIGNsYXNzIGFzIGFuIEVudGl0eSwgTWFwcGVkIFN1cGVyY2xhc3MsIG9yIEVtYmVkZGFibGUgcGVyc2lzdGVudCBlbnRpdHkuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE3NCIgbmFtZT0ic3RocmVmMTc0Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNvbHVtbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5Zb3UgbWFwcGVkIGFuIGVudGl0eSdzIGZpZWxkIHRvIGFuIGluY29ycmVjdCBvciBpbnZhbGlkIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIEJ5IGRlZmF1bHQsIERhbGkgd2lsbCBhdHRlbXB0IHRvIG1hcCBlYWNoIGZpZWxkIGluIHRoZSBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBJZiB0aGUgZmllbGQncyBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgcm93J3MgbmFtZSwgeW91IG11c3QgZXhwbGljaXRseSBjcmVhdGUgdGhlIG1hcHBpbmcuPC9wPgotPHA+TWFwIHRoZSBmaWVsZCB0byBhIHZhbGlkIHJvdyBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+Ik1hcHBpbmcgYW4gZW50aXR5IjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE3NSIgbmFtZT0ic3RocmVmMTc1Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkR1cGxpY2F0ZSBjbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIuPC9wPgotPHA+WW91IGNyZWF0ZWQgdG8gcGVyc2lzdGVuY2UgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIEVhY2ggSmF2YSBjbGFzcyBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gU2VlIDxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3NiIgbmFtZT0ic3RocmVmMTc2Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkVudGl0eSBkb2VzIG5vdCBoYXZlIGFuIElkIG9yIEVtYmVkZGVkIElkLjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aG91dCBpZGVudGlmeWluZyBpdHMgcHJpbWFyeSBrZXkuIEEgcGVyc2lzdGVudCBlbnRpdHkgbXVzdCBoYXZlIGEgcHJpbWFyeSBrZXkgZmllbGQgZGVzaWduYXRlZCB3aXRoIGFuIDxjb2RlPkBJZDwvY29kZT4gb3IgPGNvZGU+QEVtYmVkZGVkSWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+QWRkIGFuIElEIG1hcHBpbmcgdG8gdGhlIGVudGl0eSBhcyBzaG93biBpbiA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPiJJRCBtYXBwaW5nIjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMTEuaHRtI0NJSERJQUVFIj4iRW1iZWRkZWQgSUQgbWFwcGluZyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzciIG5hbWU9InN0aHJlZjE3NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5NdWx0aXBsZSBwZXJzaXN0ZW5jZS54bWwgZmlsZXMgaW4gcHJvamVjdC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIEpQQSBwcm9qZWN0IHdpdGggbW9yZSB0aGFuIG9uZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIEVhY2ggSlBBIHByb2plY3QgbXVzdCBjb250YWluIGEgPHNwYW4gY2xhc3M9Iml0YWxpYyI+c2luZ2xlPC9zcGFuPiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZSB1bml0IGRlZmluZWQuPC9wPgotPHA+VGhlcmUgaXMgbm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIFVzZSB0aGUgJmx0O3BlcnNpc3RlbmNlLXVuaXQgbmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1VOSVRfTkFNRSZndDs8L3NwYW4+IiB0YWcgdG8gZGVmaW5lIHRoZSBwZXJzaXN0ZW50IHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3OSIgbmFtZT0ic3RocmVmMTc5Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPk5vIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgwIiBuYW1lPSJzdGhyZWYxODAiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+UmVmZXJlbmNlZCBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBpbiBqb2luIGNvbHVtbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5UaGUgY29sdW1uIHRoYXQgeW91IHNlbGVjdGVkIHRvIGpvaW4gYSByZWxhdGlvbnNoaXAgbWFwcGluZyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZGF0YWJhc2UgdGFibGUuIEVpdGhlciBzZWxlY3QgYSBkaWZmZXJlbnQgY29sdW1uIG9uIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JBRUJDIj5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9hPiBvciBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb2x1bW4gb24gdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj4iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MSIgbmFtZT0ic3RocmVmMTgxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlNjaGVtYSAiJmx0OzxzcGFuIGNsYXNzPSJpdGFsaWMiPlNDSEVNQV9OQU1FPC9zcGFuPiZndDsiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGUvam9pbiB0YWJsZSAiJmx0OzxzcGFuIGNsYXNzPSJpdGFsaWMiPlRBQkxFX05BTUU8L3NwYW4+Jmd0OyIuPC9wPgotPHA+RGVmaW5lIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHNjaGVtYSBpbmZvcm1hdGlvbiBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgyIiBuYW1lPSJzdGhyZWYxODIiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VGFibGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5Zb3UgYXNzb2NpYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGFuIGluY29ycmVjdCBvciBpbnZhbGlkIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBhc3NvY2lhdGUgZWFjaCBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIGFuIGlkZW50aWNhbGx5IG5hbWVkIGRhdGFiYXNlIHRhYmxlLiBJZiB0aGUgZW50aXR5J3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHRhYmxlJ3MgbmFtZSwgeW91IG11c3QgZXhwbGljaXRseSBjcmVhdGUgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTxwPkFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSB2YWxpZCBkYXRhYmFzZSB0YWJsZSBhcyBzaG93biBpbiA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5VbnJlc29sdmVkIGdlbmVyYXRvciAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIGRlZmluZWQgaW4gcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbmNlIGVudGl0eSB0aGF0IHVzZXMgc2VxdWVuY2luZyBvciBhIHRhYmxlIGdlbmVyYXRvciwgYnV0IGRpZCBub3QgZGVmaW5lIHRoZSBnZW5lcmF0b3IgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEVpdGhlciBkZWZpbmUgdGhlIGdlbmVyYXRvciBieSB1c2luZyBhbiBhbm5vdGF0aW9uIG9yIGluY2x1ZGluZyBpdCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3ByYnZpZXcuaHRtIj5Qcm9ibGVtcyB2aWV3PC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWJjOTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPldhcm5pbmcgbWVzc2FnZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhHRUFJSiIgbmFtZT0iQ0lIR0VBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldhcm5pbmcgbWVzc2FnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdhcm5pbmcgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxODQiIG5hbWU9InN0aHJlZjE4NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db25uZWN0aW9uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09OTkVDVElPTl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHlvdSBzcGVjaWZpZWQgdG8gdXNlIHdpdGggdGhlIEpQQSBwcm9qZWN0IGlzIG5vdCBhY3RpdmUuIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTg1IiBuYW1lPSJzdGhyZWYxODUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBwcm9qZWN0LiBObyBkYXRhLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMjQuaHRtI0JBQkRCQ0JJIj4iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmZjMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQkNCSSIgbmFtZT0iQkFCREJDQkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvaDE+Ci08cD5FYWNoIHBlcnNpc3RlbnQgcHJvamVjdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkRhdGFiYXNlIENvbm5lY3Rpb248L3NwYW4+IHVzZSB0aGUgTmV3IENvbm5lY3Rpb24gd2l6YXJkLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBtb2RpZnkgdGhlIHZlbmRlci1zcGVjaWZpYyBwbGF0Zm9ybSBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggeW91ciBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkV4cGxvcmVyPC9zcGFuPiB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9wZXJ0aWVzPC9zcGFuPi4gVGhlIFByb3BlcnRpZXMgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE4NiIgbmFtZT0ic3RocmVmMTg2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyIgYWx0PSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIHRpdGxlPSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSBlYWNoIGZpZWxkIG9uIHRoZSA8YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+IGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmM2EwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGlwcyBhbmQgdHJpY2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDEtMjJUOToyOTo1NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGlwcyBhbmQgdHJpY2tzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+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+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+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+Ci0gICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkODljYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFdoYXQncyBuZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyODYiIG5hbWU9InN0aHJlZjI4NiI+PC9hPiBXaGF0J3MgbmV3PC9wPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aW9ucyBvZiB0aGUgZm9sbG93aW5nIG5ldyBmZWF0dXJlcyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyBtYWRlIHRvIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBmb3IgUmVsZWFzZSAyLjM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNDSkFDRURERSI+TXVsdGlwbGUgSW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIFBlcnNwZWN0aXZlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDMuaHRtI0NKQURJRkhKIj5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNDSkFCSUpFQyI+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNDSkFDSkJEQSI+RWNsaXBzZUxpbmsgMS4xIFN1cHBvcnQ8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmYThhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjg3IiBuYW1lPSJzdGhyZWYyODciPjwvYT4KLTxoMT5JbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uPC9oMT4KLTxwPlRoaXMgcmVsZWFzZSBvZiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgcHJvdmlkZXMgaW1wcm92ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIGFuZCBsb2NhbGl6YXRpb24gc3VwcG9ydC4gRGFsaSBwcm9qZWN0cyBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBhbmQgcHJvY2Vzc2luZyBvZiBpbnRlcm5hdGlvbmFsIGRhdGEgKHN1Y2ggYXMgZGF0ZXMgYW5kIHN0cmluZ3MpLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTgyZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTXVsdGlwbGUgSW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIFBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBQ0VEREUiIG5hbWU9IkNKQUNFRERFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmU8L2gxPgotPHA+VGhlcmUgaGF2ZSBiZWVuIG11bHRpcGxlIGltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBwZXJzcGVjdGl2ZXMgdG8gaW1wcm92ZSBpdHMgZWFzZS1vZi11c2U6PC9wPgotPHVsPgotPGxpPgotPHA+VGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+IG5vdyBhY2NlcHRzIHNob3J0IG5hbWVzIGFzIGF0dHJpYnV0ZSB0eXBlcy48L3A+Ci08L2xpPgotPGxpPgotPHA+RGFsaSB3aWxsIHBlcmZvcm0gdmFsaWRhdGlvbiBhZnRlciByZWZyZXNoaW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmNzMxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbms8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wMS0yMlQ5OjI5OjU2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBRElGSEoiIG5hbWU9IkNKQURJRkhKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvaDE+Ci08cD5UaGlzIHJlbGVhc2Ugb2YgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIHN1cHBvcnRzIGdlbmVyaWMgSlBBIDIuMCBhcyB3ZWxsIGFzIHNwZWNpZmljIGl0ZW1zIGZvciBFY2xpc3BlTGluayAxLjIuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkZmY5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUJJSkVDIiBuYW1lPSJDSkFCSUpFQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHVzZXMgdGhlIEVjbGlwc2UgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZTwvc3Bhbj4gbWVudSB0byBjb252ZXJ0IGV4aXN0aW5nIEphdmEgcHJvamVjdHMgdG8gSlBBIHByb2plY3RzLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrczAwMS5odG0jQkVJQkFESEgiPiJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE1ZTE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FY2xpcHNlTGluayAxLjEgU3VwcG9ydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWNsaXBzZUxpbmsgMS4xIFN1cHBvcnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFDSkJEQSIgbmFtZT0iQ0pBQ0pCREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVjbGlwc2VMaW5rIDEuMSBTdXBwb3J0PC9oMT4KLTxwPlJlbGVhc2UgMi4zIHByb3ZpZGVzIHN1cHBvcnQgb2YgdGhlIGZvbGxvd2luZyBFY2xpcHNlTGluayAxLjEgZmVhdHVyZXMuPC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9uczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUtdG8tTWFueSBtYXBwaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPndpdGhvdXQ8L3NwYW4+IGEgam9pbiB0YWJsZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPkVjbGlwc2VMaW5rICh0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0KSBpcyBhIGNvbXBsZXRlIHBlcnNpc3RlbmNlIGZyYW1lIHdvcmsuIFJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzY1MmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTAxLTIyVDk6Mjk6NTZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyODgiIG5hbWU9InN0aHJlZjI4OCI+PC9hPgotPGgxPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHN1cHBvcnRzIHRoZSBKUEEgMS4wLW9wdGlvbmFsIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZSBvcHRpb24uIFRoaXMgZnVuY3Rpb25hbGl0eSBtYXkgYmUgcmVxdWlyZWQgaW4gSlBBIDIuMC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWE3YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MDkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzNhZjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGUzNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTQ1NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzYwZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYWZlY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3BlcnNpc3RlbmNlLmphciIgc291cmNlcGF0aD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2Vuc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzYzMTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNTVmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAwNyAxNDoyNjo1NCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0MWJjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jV2VkIEFwciAzMCAxNzoyNDo0MSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzhhMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGliL3BlcnNpc3RlbmNlLmphcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBqYXZheC5wZXJzaXN0ZW5jZSwKLSBqYXZheC5wZXJzaXN0ZW5jZS5zcGksCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmNTg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmN2JjZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGxpYi9wZXJzaXN0ZW5jZS5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vbGliL3BlcnNpc3RlbmNlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExYjIzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vbGliL3BlcnNpc3RlbmNlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzZWYxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gRERMIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjFiZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqIAotICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgRWNsaXBzZUxpbmsgPGNvZGU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NvZGU+LCAKLSAqIGFuZCBleGVjdXRlcyB0aGUgRERMIGdlbmVyYXRvciB3aXRoIHRoZSBjb21tYW5kIHNldCBpbiB0aGUgcHJvcGVydGllczogCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU8L2NvZGU+IAotICogICAgIDxjb2RlPmVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uPC9jb2RlPgotICogCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1wdSBwdU5hbWVdIC0gcGVyc2lzdGVuY2UgdW5pdCBuYW1lCi0gKiAgICAgWy1wIHByb3BlcnRpZXNGaWxlUGF0aF0gLSBwcm9wZXJ0aWVzIGZvciBFY2xpcHNlTGluayBFbnRpdHlNYW5hZ2VyCi0gKiAgCi0gKiAgRXhhbXBsZSBvZiBhIHByb3BlcnRpZXMgZmlsZToKLSAqICAJZWNsaXBzZWxpbmsuamRiYy5iaW5kLXBhcmFtZXRlcnM9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsuamRiYy5kcml2ZXI9b3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMudXJsPWpkYmNcOmRlcmJ5XDpjXDovZGVyYnlkYi90ZXN0ZGI7Y3JlYXRlXD10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMudXNlcj10cmFuCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMucGFzc3dvcmQ9Ci0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWw9RklORVNUCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcudGhyZWFkPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbj1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnM9dHJ1ZQotICogIAllY2xpcHNlbGluay5vcm0udGhyb3cuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uLm91dHB1dC1tb2RlPWRhdGFiYXNlCi0gKiAgCWVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uPWRyb3AtYW5kLWNyZWF0ZS10YWJsZXMKLSAqICAJZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb249Y1w6L19Qcm9qZWN0c18vRXhhbXBsZURETAotICovCi1wdWJsaWMgY2xhc3MgTWFpbgotewotCXByb3RlY3RlZCBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWY7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGVjbGlwc2VMaW5rUHJvcGVydGllczsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVERExGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRERMRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aDsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE1haW4oKS5leGVjdXRlKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJdGhpcy5pbml0aWFsaXplV2l0aChhcmdzKTsKLQkJCi0JCXRoaXMuZW1mID0gUGVyc2lzdGVuY2UuY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkodGhpcy5nZXRQVU5hbWUoYXJncyksIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzKTsKLQkJdGhpcy5wZXJmb3JtKCk7Ci0JCXRoaXMuY2xvc2VFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpOwotCQkKLQkJdGhpcy5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybSgpIHsKLQkJLy8gY3JlYXRlIGFuIEVNIHRvIGdlbmVyYXRlIHNjaGVtYS4KLQkJdGhpcy5lbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpLmNsb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKSB7Ci0JCXRoaXMuZW1mLmNsb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoID0gdGhpcy5nZXRFY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKGFyZ3MpOwotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyh0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotCQkKLQkJdGhpcy5jcmVhdGVERExGaWxlTmFtZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyggCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUsIAotCQkJCQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMsICAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FKTsKLQotCQl0aGlzLmRyb3BERExGaWxlTmFtZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZygKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUsIAotCQkJCQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMsICAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSk7IAotCQkKLQkJdGhpcy5hcHBMb2NhdGlvbiA9IHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldCgKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldERlYnVnTW9kZShhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJaWYoICEgdGhpcy5pc0RlYnVnTW9kZSkgewotCQkJbmV3IEZpbGUodGhpcy5hcHBMb2NhdGlvbiArICIvIiArIHRoaXMuY3JlYXRlRERMRmlsZU5hbWUpLmRlbGV0ZSgpOwotCQkJbmV3IEZpbGUodGhpcy5hcHBMb2NhdGlvbiArICIvIiArIHRoaXMuZHJvcERETEZpbGVOYW1lKS5kZWxldGUoKTsKLQkJCW5ldyBGaWxlKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpIHsKLQkJCi0JCVNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IHByb3BlcnRpZXNTZXQgPSBudWxsOwotCQl0cnkgewotCQkJcHJvcGVydGllc1NldCA9IHRoaXMubG9hZEVjbGlwc2VMaW5rUHJvcGVydGllcyhlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmc6ICIgKyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoLCBlKTsKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvcihFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzU2V0KSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKXByb3BlcnR5LmdldEtleSgpLCAoU3RyaW5nKXByb3BlcnR5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotICAgIHByaXZhdGUgU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gbG9hZEVjbGlwc2VMaW5rUHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotICAgICAgICAKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5lbnRyeVNldCgpOwotCX0KLQotCS8vICoqKioqKioqKiogYXJndW1lbnQgcXVlcmllcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UFVOYW1lKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcHUiLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXAiLCBhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50VmFsdWUoU3RyaW5nIGFyZ3VtZW50LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ3VtZW50KSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqKiB1dGlsaXR5IG1ldGhvZHMgKioqKioqKgotCQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBwcm92aWRlZCBtYXAgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBrZXkuICBJZiB0aGF0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlLCBjaGVjayB0aGUKLSAgICAgKiBTeXN0ZW0gcHJvcGVydGllcy4gIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgZnJvbSBlaXRoZXIgbG9jYXRpb24sIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgCi0gICAgICogQHBhcmFtIG1hcCAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIAotICAgICAqIEByZXR1cm4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKFN0cmluZyBwcm9wZXJ0eUtleSwgTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMsIFN0cmluZyBkZWZhdWx0VmFsdWUpewotICAgIAlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcocHJvcGVydHlLZXksIG92ZXJyaWRlcyk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKFN0cmluZyBwcm9wZXJ0eUtleSwgTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMpewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBpZiAob3ZlcnJpZGVzICE9IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKW92ZXJyaWRlcy5nZXQocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI1NzQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmQ1MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxNWZmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MDcgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZDUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6Mjg6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OGFmMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZ2VuCi1CdW5kbGUtVmVyc2lvbjogMS4zLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjQuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztidW5kbGUtdmVyc2lvbj0iMi4xLjAiLAotIG9yZy5hcGFjaGUub3JvO2J1bmRsZS12ZXJzaW9uPSIyLjAuOCIsCi0gb3JnLmFwYWNoZS52ZWxvY2l0eTtidW5kbGUtdmVyc2lvbj0iMS41LjAiLAotIG9yZy5qZG9tO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWI2MDI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZTA0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4iPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUyZDhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRW50aXR5IEdlbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wcm9wZXJ0eV9maWxlcy9qcHRfZ2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDI0YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wcm9wZXJ0eV9maWxlcy9qcHRfZ2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZT1HZW5lcmF0ZSBFbnRpdGllcwotR2VuU2NvcGVfdGFza05hbWU9QnVpbGQgRGF0YWJhc2UgTW9kZWwKLUVudGl0eUdlbmVyYXRvcl90YXNrTmFtZT1HZW5lcmF0ZSBFbnRpdHk6IHswfQotRXJyb3JfR2VuZXJhdGluZ19FbnRpdGllcyA9IEVycm9yIEdlbmVyYXRpbmcgRW50aXRpZXMKLQotVGVtcGxhdGVzX25vdEZvdW5kID0gVW5hYmxlIHRvIGZpbmQgSlBBIGVudGl0aWVzIGdlbmVyYXRpb24gdGVtcGxhdGVzIGluIHBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YTVhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIE9STSBhc3NvY2lhdGlvbi4KLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgYXNzb2NpYXRpb25zOgotICogPHVsPjxsaT5zaW1wbGUgYXNzb2NpYXRpb246IEFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIGRhdGFiYXNlIHRhYmxlcy4KLSAqIFRoZSA8ZW0+cmVmZXJyZXI8L2NvZGU+IHRhYmxlIGlzIHRoZSBvbmUgY29udGFpbmluZyB0aGUgZm9yZWlnbiBrZXkKLSAqICwgdGhlIDxlbT5yZWZlcmVuY2VkPC9jb2RlPiB0YWJsZSBpcyB0aGUgb3RoZXIgcGFydHkuPGJyPgotICogCi0gKiA8bGk+bWFueSB0byBtYW55IGFzc29jaWF0aW9uOiBBbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byB0YWJsZXMgam9pbmVkIGJ5IAotICogYSA8ZW0+am9pbiB0YWJsZTwvZW0+LgotICogSW4gdGhlIGV4YW1wbGUgQVVUSE9SLCBCT09LLCBBVVRIT1JfQk9PSywgVGhlIHJlZmVycmVyIGFuZCByZWZlcmVuY2VkIGFyZSAKLSAqIEFVVEhPUiBhbmQgIEJPT0ssIGFuZCB0aGUgam9pbiB0YWJsZSBpcyBBVVRIT1JfQk9PSy4KLSAqIDwvdWw+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkUgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJtYW55LXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkUgPSAib25lLXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJX0RJID0gImJpLWRpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUxfREkgPSAibm9ybWFsLWRpIjsgLy9yZWZlcnJlci0+cmVmZXJlbmNlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QUE9TSVRFX0RJID0gIm9wcG9zaXRlLWRpIjsgLy9yZWZlcmVuY2VkLT5yZWZlcnJlcgotCQotCXByaXZhdGUgdHJhbnNpZW50IE9STUdlbkN1c3RvbWl6ZXIgbUN1c3RvbWl6ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1Kb2luVGFibGVOYW1lOwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVycmVyQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckpvaW5Db2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVyZW5jZWRKb2luQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcnJlckNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJlbmNlZENvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJyZXJKb2luQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcmVuY2VkSm9pbkNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCQotCXByaXZhdGUgU3RyaW5nIG1DYXJkaW5hbGl0eTsKLQlwcml2YXRlIFN0cmluZyBtRGlyZWN0aW9uYWxpdHk7Ci0JcHJpdmF0ZSBieXRlIG1GbGFncyA9IEdFTkVSQVRFRDsKLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uUm9sZSBtUmVmZXJyZXJSb2xlOwotCXByaXZhdGUgQXNzb2NpYXRpb25Sb2xlIG1SZWZlcmVuY2VkUm9sZTsKLQotCXByaXZhdGUgdHJhbnNpZW50IEZvcmVpZ25LZXkgbUZvcmVpZ25LZXk7CQotCQotCS8qY29uc3RhbnRzIGZvciBtRmxhZ3MqLwotCS8qd2hldGhlciB0aGUgYXNzb2NpYXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBHRU5FUkFURUQgPSAxIDw8IDA7Ci0JLyp3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBjdXN0b20gKGkuZSBpcyBub3QgYXV0byBjb21wdXRlZCBmcm9tIGZvcmVpZ24ga2V5cyByZWxhdGlvbnNoaXBzKS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1VTVE9NID0gMSA8PCAxOwotCQotCS8qKgotCSAqIFRoZSBzaW1wbGUgYXNzb2NpYXRpb24gY29uc3RydWN0b3IuCi0JICogVGhlIDIgdGFibGVzIGFyZSBqb2luZWQgd2hlbiB0aGUgdmFsdWVzIG9mIGVhY2ggY29sdW1uIGluCi0JICogcmVmZXJyZXJDb2xOYW1lcyBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSByZWZlcnJlclRhYmxlTmFtZSBUaGUgImZvcmVpZ24ga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJyZXJDb2xOYW1lcyBUaGUgY29sdW1uIG5hbWVzIGluIHRoZSByZWZlcnJlciB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZFRhYmxlTmFtZSBUaGUgInByaW1hcnkga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbE5hbWVzIFRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcykgIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQkJbVJlZmVycmVyQ29sTmFtZXMgPSByZWZlcnJlckNvbE5hbWVzOwotCQltUmVmZXJlbmNlZENvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQkKLQkJbUNhcmRpbmFsaXR5ID0gTUFOWV9UT19PTkU7Ci0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBUaGUgbWFueSB0byBtYW55IGNvbnN0cnVjdG9yLgotCSAqIFRoZSAyIHRhYmxlcyBhcmUgam9pbmVkIHdoZW4gdGhlIHZhbHVlcyBvZiBlYWNoIGNvbHVtbiBpbgotCSAqIHJlZmVycmVyQ29sTmFtZXMgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHJlZmVycmVySm9pbkNvbE5hbWVzCi0JICogLCBhbmQgZWFjaCBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzIG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiByZWZlcmVuY2VkSm9pbkNvbE5hbWVzLgotCSAqCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcwotCQkJLCBTdHJpbmcgam9pblRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVycmVySm9pbkNvbE5hbWVzLCBMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcykgewotCQlzdXBlcigpOwotCQkKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltUmVmZXJyZXJUYWJsZU5hbWUgPSByZWZlcnJlclRhYmxlTmFtZTsKLQkJbVJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lOwotCQltUmVmZXJyZXJDb2xOYW1lcyA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkQ29sTmFtZXMgPSByZWZlcmVuY2VkQ29sTmFtZXM7Ci0JCW1Kb2luVGFibGVOYW1lID0gam9pblRhYmxlTmFtZTsKLQkJbVJlZmVycmVySm9pbkNvbE5hbWVzID0gcmVmZXJyZXJKb2luQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzID0gcmVmZXJlbmNlZEpvaW5Db2xOYW1lczsKLQkJCi0JCW1DYXJkaW5hbGl0eSA9IE1BTllfVE9fTUFOWTsJCi0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbiAoc2hvdWxkIG5vdCBiZSB1c2VkIG90aGVyd2lzZSkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKCkgewotCX0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgY2FyZGluYWxpdHkgYmFzZWRvbiB0aGUgZm9yaWduIGtleSBkZWZpbml0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlQ2FyZGluYWxpdHkoKSAgewotCQkvKmJ5IGRlZmF1bHQgdGhlIGFzc29jaWF0aW9uIGlzIG1hbnktdG8tb25lIHVubGVzcyB0aGUgZm9yZWlnbiBrZXkgCi0JCSAqIGlzIGFsc28gdGhlIHByaW1hcnkga2V5LCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgb25lLXRvLW9uZS4qLwotCQltQ2FyZGluYWxpdHkgPSBNQU5ZX1RPX09ORTsKLQkJCi0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZWZlcnJlckNvbHMgPSBnZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHBrQ29scyA9IGdldFJlZmVycmVyVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQlpZiAocGtDb2xzLnNpemUoKSA9PSByZWZlcnJlckNvbHMuc2l6ZSgpKSB7Ci0JCQlib29sZWFuIGlzRmtQayA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IHBrQ29scy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQlpZiAoISgoT1JNR2VuQ29sdW1uKXBrQ29scy5nZXQoaSkpLmdldE5hbWUoKS5lcXVhbHMoKChPUk1HZW5Db2x1bW4pcmVmZXJyZXJDb2xzLmdldChpKSkuZ2V0TmFtZSgpKSkgewotCQkJCQlpc0ZrUGsgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzRmtQaykgewotCQkJCW1DYXJkaW5hbGl0eSA9IE9ORV9UT19PTkU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldEN1c3RvbShmYWxzZSk7Ci0JfQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQkKLQkJaWYgKG1SZWZlcnJlclJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVycmVyUm9sZS5yZXN0b3JlKHRoaXMpOwotCQl9Ci0JCWlmIChtUmVmZXJlbmNlZFJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRSb2xlLnJlc3RvcmUodGhpcyk7Ci0JCX0KLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSAgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXIuZ2V0VGFibGUobVJlZmVycmVyVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZTsKLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCXJldHVybiBtQ3VzdG9taXplci5nZXRUYWJsZShtUmVmZXJlbmNlZFRhYmxlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCX0KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0Sm9pblRhYmxlKCkgIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyLmdldFRhYmxlKG1Kb2luVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gbUpvaW5UYWJsZU5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVycmVyCi0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpIHsKLQkJaWYgKG1SZWZlcnJlckNvbHMgPT0gbnVsbCkgewotCQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJCW1SZWZlcnJlckNvbHMgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckNvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVycmVyQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVyQ29sTmFtZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJlbmNlZENvbHMgPT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRDb2xzID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVyZW5jZWRDb2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJlbmNlZENvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJyZXJKb2luQ29scyA9PSBudWxsKSB7Ci0JCQltUmVmZXJyZXJKb2luQ29scyA9IGdldEpvaW5UYWJsZSgpLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlckpvaW5Db2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVySm9pbkNvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpICB7Ci0JCWlmIChtUmVmZXJlbmNlZEpvaW5Db2xzID09IG51bGwpIHsKLQkJCW1SZWZlcmVuY2VkSm9pbkNvbHMgPSBnZXRKb2luVGFibGUoKS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJcmV0dXJuIG1DYXJkaW5hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2FyZGluYWxpdHkoU3RyaW5nIGNhcmRpbmFsaXR5KSB7Ci0JCWFzc2VydChjYXJkaW5hbGl0eS5lcXVhbHMoTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhNQU5ZX1RPX01BTlkpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhPTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoT05FX1RPX01BTlkpKTsKLQkJbUNhcmRpbmFsaXR5ID0gY2FyZGluYWxpdHk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIGRpcmVjdGlvbmFsaXR5LCBvbmUgb2Yge0BsaW5rICNCSV9ESX18e0BsaW5rICNOT1JNQUxfREl9Ci0JICogfHtAbGluayAjT1BQT1NJVEVfREl9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb25hbGl0eSgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uYWxpdHkoU3RyaW5nIGRpcikgewotCQlhc3NlcnQoZGlyLmVxdWFscyhCSV9ESSkgfHwgZGlyLmVxdWFscyhOT1JNQUxfREkpIHx8IGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKTsKLQkJaWYgKCFkaXIuZXF1YWxzKG1EaXJlY3Rpb25hbGl0eSkpIHsKLQkJCW1EaXJlY3Rpb25hbGl0eSA9IGRpcjsKLQkJCQotCQkJaWYgKGRpci5lcXVhbHMoTk9STUFMX0RJKSkgewotCQkJCW1SZWZlcmVuY2VkUm9sZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKSB7Ci0JCQkJbVJlZmVycmVyUm9sZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGFzc29jaWF0aW9uIGlzIGJpZGlyZWN0aW9uYWwuCi0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciA8Y29kZT5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhCSV9ESSk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbCgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eS5lcXVhbHMoQklfREkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhpcyBhc3NvY2lhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBHRU5FUkFURUQpICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpZiAoZ2VuZXJhdGVkICE9IGlzR2VuZXJhdGVkKCkpIHsKLQkJCWlmIChnZW5lcmF0ZWQpIHsKLQkJCQltRmxhZ3MgfD0gR0VORVJBVEVEOwotCQkJfSBlbHNlIHsKLQkJCQltRmxhZ3MgJj0gfkdFTkVSQVRFRDsKLQkJCX0KLQkJCW1SZWZlcnJlclJvbGUgPSBtUmVmZXJlbmNlZFJvbGUgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGlzIGFzc29jaWF0aW9uIGlzIGN1c3RvbSAoaS5lIGlzIG5vdCBhdXRvIGNvbXB1dGVkIGZyb20gZm9yZWlnbiBrZXlzIHJlbGF0aW9uc2hpcHMpLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBDVVNUT00pICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbShib29sZWFuIGN1c3RvbSkgewotCQlpZiAoY3VzdG9tKSB7Ci0JCQltRmxhZ3MgfD0gQ1VTVE9NOwotCQl9IGVsc2UgewotCQkJbUZsYWdzICY9IH5DVVNUT007Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gcm9sZSBmb3IgdGhlIHJlZmVycmVyIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVycmVyUm9sZSgpIHsKLQkJaWYgKG1SZWZlcnJlclJvbGUgPT0gbnVsbCAmJiBpc0dlbmVyYXRlZCgpKSB7Ci0JCQlpZiAoIWdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKE9QUE9TSVRFX0RJKSkgeyAvL0JJX0RJIG9yIE5PUk1BTF9ESQotCQkJCW1SZWZlcnJlclJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIHRydWUvKmlzUmVmZXJyZXJFbmQqLyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlclJvbGU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIHJvbGUgZm9yIHRoZSByZWZlcmVuY2VkIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVyZW5jZWRSb2xlKCkgewotCQlpZiAobVJlZmVyZW5jZWRSb2xlID09IG51bGwgJiYgaXNHZW5lcmF0ZWQoKSkgewotCQkJaWYgKCFnZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5OT1JNQUxfREkpKSB7IC8vQklfREkgb3IgT1BQT1NJVEVfREkKLQkJCQltUmVmZXJlbmNlZFJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIGZhbHNlLyppc1JlZmVycmVyRW5kKi8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtUmVmZXJlbmNlZFJvbGU7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBhc3NvY2lhdGlvbiBpcyB2YWxpZCAodmFsaWQgdGFibGUgYW5kIGNvbHVtbiBuYW1lcykuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpewotCQlpZiAoIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobVJlZmVycmVyVGFibGVOYW1lLCBtUmVmZXJyZXJDb2xOYW1lcykKLQkJCQl8fCAhaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtUmVmZXJlbmNlZFRhYmxlTmFtZSwgbVJlZmVyZW5jZWRDb2xOYW1lcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobUpvaW5UYWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJyZXJKb2luQ29sTmFtZXMpCi0JCQkJCXx8ICFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcykgewotCQlPUk1HZW5UYWJsZSB0YWJsZSA9IG1DdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZSk7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5OYW1lcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCVN0cmluZyBjb2xOYW1lID0gKFN0cmluZyljb2x1bW5OYW1lcy5nZXQoaSk7Ci0JCQlpZiAodGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbE5hbWUpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXRoaXMubUZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotCQkKLQl9Ci0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpewotCQlyZXR1cm4gdGhpcy5tRm9yZWlnbktleTsKLQl9OwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiggdGhpcyA9PSBvYmogKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKCBvYmogaW5zdGFuY2VvZiBBc3NvY2lhdGlvbiApewotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24yID0gKEFzc29jaWF0aW9uKW9iajsKLQkJCWlmICghdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKQotCQkJCQl8fCAhU3RyaW5nVXRpbC5lcXVhbE9iamVjdHModGhpcy5nZXRKb2luVGFibGVOYW1lKCksIGFzc29jaWF0aW9uMi5nZXRKb2luVGFibGVOYW1lKCkpCi0JCQkJCXx8ICF0aGlzLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSkKLQkJCQkJKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQkJCi0JCQkvKnRoZSAyIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgcmVmZXJyZXIsIHJlZmVyZW5jZWQgYW5kIGpvaW4gdGFibGUqLwotCQkJLy9JZiBNVE8gb3IgT1RNIGFzc29jaWF0aW9uCi0JCQlpZiAodGhpcy5nZXRKb2luVGFibGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHRoaXMuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkpCi0JCQkJCSYmIHRoaXMuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZSArICIgIiArIG1DYXJkaW5hbGl0eSArICIgIiArIG1SZWZlcmVuY2VkVGFibGVOYW1lIDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uUm9sZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvblJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2NTRmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGFzc29jaWF0aW9uIHJvbGUgKHRoZSByZWZlcnJlciBvciByZWZlcmVuY2VkIHJvbGUpLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvblJvbGUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgdHJhbnNpZW50IEFzc29jaWF0aW9uIG1Bc3NvY2lhdGlvbjsgLy90cmFuc2llbnQ6IHNlZSByZXN0b3JlCi0JcHJpdmF0ZSBib29sZWFuIG1Jc1JlZmVycmVyUm9sZTsKLQlwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1DYXNjYWRlOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0JCQotCUFzc29jaWF0aW9uUm9sZShBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiwgYm9vbGVhbiBpc1JlZmVycmVyUm9sZSkgewotCQlzdXBlcigpOwotCQkKLQkJbUFzc29jaWF0aW9uID0gYXNzb2NpYXRpb247Ci0JCW1Jc1JlZmVycmVyUm9sZSA9IGlzUmVmZXJyZXJSb2xlOwotCX0KLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbiAoc2hvdWxkIG5vdCBiZSB1c2VkIG90aGVyd2lzZSkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBhc3Njb2NpYXRpb25zIGFyZSBkZXNlcmlhbGl6ZWQgdG8gYXR0YWNoIAotCSAqIHRoZSBjdXN0b21pemVyIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSB7Ci0JCW1Bc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCX0KLQkKLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0QXNzb2NpYXRpb24oKSB7Ci0JCXJldHVybiBtQXNzb2NpYXRpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJyZXJSb2xlKCkgewotCQlyZXR1cm4gbUlzUmVmZXJyZXJSb2xlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcHBvc2l0ZSByb2xlIG9yIG51bGwgaWYgdGhlIGFzc29jaWF0aW9uIAotCSAqIGlzIG5vdCBiaSBkaXJlY3Rpb25hbC4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldE9wcG9zaXRlUm9sZSgpIHsKLQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBnZXRBc3NvY2lhdGlvbigpOwotCQlpZiAoIWFzc29jaWF0aW9uLmdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKEFzc29jaWF0aW9uLkJJX0RJKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGlzUmVmZXJyZXJSb2xlKCkpIHsKLQkJCXJldHVybiBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIGNhcmRpbmFsaXR5LCBvbmUgb2Yge0BsaW5rICNNQU5ZX1RPX09ORX18e0BsaW5rICNNQU5ZX1RPX01BTll9Ci0JICogfHtAbGluayAjT05FX1RPX09ORX18e0BsaW5rICNPTkVfVE9fTUFOWX0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcmRpbmFsaXR5KCkgewotCQlTdHJpbmcgdHlwZSA9IG1Bc3NvY2lhdGlvbi5nZXRDYXJkaW5hbGl0eSgpOwotCQlpZiAoIW1Jc1JlZmVycmVyUm9sZSkgewotCQkJaWYgKHR5cGUuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZKSkgewotCQkJCXR5cGUgPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORTsKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpKSB7Ci0JCQkJdHlwZSA9IEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0UmVmZXJyZXJUYWJsZSgpIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJyZXJDb2x1bW5zKCl7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gY29ycmVzcG9uZGluZyB0byBhIHJlZmVycmVyIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oU3RyaW5nIHJlZmVycmVyQ29sdW1uKSAgewotCQlib29sZWFuIGhhc0pvaW5UYWJsZSA9IG1Bc3NvY2lhdGlvbi5nZXRKb2luVGFibGUoKSAhPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVmZXJyZXJDb2x1bW5zID0gZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gcmVmZXJyZXJDb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IHJlZmVycmVyQ29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sdW1uLmdldE5hbWUoKS5lcXVhbHMocmVmZXJyZXJDb2x1bW4pKSB7Ci0JCQkJaWYgKGhhc0pvaW5UYWJsZSkgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJyZXJKb2luQ29sdW1ucygpLmdldChpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydChmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcnJlciBjb2x1bW4gY29ycmVzcG9uZGluZyB0byBhIHJlZmVyZW5jZWQgY29sdW1uLgotCSAqLwotCXB1YmxpYyBPUk1HZW5Db2x1bW4gZ2V0UmVmZXJyZXJDb2x1bW4oU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW4pICB7Ci0JCWJvb2xlYW4gaGFzSm9pblRhYmxlID0gbUFzc29jaWF0aW9uLmdldEpvaW5UYWJsZSgpICE9IG51bGw7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZWZlcmVuY2VkQ29sdW1ucyA9IGdldFJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gcmVmZXJlbmNlZENvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gcmVmZXJlbmNlZENvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW4pKSB7Ci0JCQkJaWYgKGhhc0pvaW5UYWJsZSkgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBnZXRSZWZlcnJlckNvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydChmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1ucygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJyZXJKb2luQ29sdW1ucygpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJKb2luQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKTsKLQkJfQotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbnMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvciBmb3IgCi0JICogdGhlIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByb2xlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgICB7Ci0JCWlmIChtUHJvcGVydHlOYW1lICE9IG51bGwpIHsgLy9pZiB0aGUgdXNlciBleHBsaWNpdGx5IHNldCBpdCB0aGVuIGRvbid0IGJlIHRvbyBzbWFydAotCQkJcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKSB7Ci0JCVN0cmluZyBwcm9wTmFtZSA9ICIiOwotCQlPUk1HZW5UYWJsZSByZWZlcnJlclRhYmxlID0gZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQlPUk1HZW5UYWJsZSByZWZlcmVuY2VkVGFibGUgPSBnZXRSZWZlcmVuY2VkVGFibGUoKTsKLQotCQlib29sZWFuIGlzU2luZ3VsYXIgPSBpc1Npbmd1bGFyKCk7Ci0JCXByb3BOYW1lID0gcmVmZXJlbmNlZFRhYmxlLmdldFZhck5hbWUoaXNTaW5ndWxhcik7Ci0JCQotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gY2xhc2hpbmdSb2xlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PEFzc29jaWF0aW9uUm9sZT4oKTsgLy9yb2xlcyB3aXRoIG91ciBzYW1lIHJlZmVycmVyIGFuZCByZWZlcmVuY2VkIHRhYmxlcyAoaS5lIHdvdWxkIHlpZWxkIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUgaW4gdGhlIHNhbWUgYmVhbikKLQkJLyptYWtlIHN1cmUgdGhlcmUgaXMgbm8gcm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUuKi8KLQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvblJvbGU+IGl0ZXIgPSByZWZlcnJlclRhYmxlLmdldEFzc29jaWF0aW9uUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJvbGUuZ2V0UmVmZXJyZXJUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMocmVmZXJyZXJUYWJsZS5nZXROYW1lKCkpCi0JCQkJCSYmIHJvbGUuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkVGFibGUuZ2V0TmFtZSgpKQotCQkJCQkmJiByb2xlLmlzU2luZ3VsYXIoKSA9PSBpc1Npbmd1bGFyKSB7Ci0JCQkJY2xhc2hpbmdSb2xlcy5hZGQocm9sZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNsYXNoaW5nUm9sZXMuc2l6ZSgpID4gMSkgewotCQkJaW50IGluZGV4ID0gY2xhc2hpbmdSb2xlcy5pbmRleE9mKHRoaXMpOwotCQkJYXNzZXJ0KGluZGV4ID49IDApOwotCQkJcHJvcE5hbWUgKz0gaW5kZXgrMTsKLQkJfQotCQkKLQkJLyptYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZS4qLwotCQlmb3IgKEl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gaXRlciA9IHJlZmVycmVyVGFibGUuZ2V0Q29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKHByb3BOYW1lKSkgewotCQkJCVN0cmluZyBwcmVmaXggPSBpc1Npbmd1bGFyID8gIkJlYW4iIDogIlNldCI7Ci0JCQkJcHJvcE5hbWUgKz0gcHJlZml4OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJvcE5hbWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1Npbmd1bGFyKCkgewotCQlTdHJpbmcgY2FyZGluYWxpdHkgPSBnZXRDYXJkaW5hbGl0eSgpOwotCQlyZXR1cm4gY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7Ci0JfQotCQotCS8qKgotCSAqIENoYW5nZXMgdGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgZ2VuZXJhdG9yIGZvciAKLQkgKiB0aGUgcHJvcGVydHkgY29ycmVzcG9uZGluZyB0byB0aGlzIHJvbGUuCi0JICogSWYgdGhlIGFyZ3VtZW50IG5hbWUgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgdGhlbiB0aGUgCi0JICogZGVmYXVsdCBjb21wdXRlZCBuYW1lIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSAgewotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCQltUHJvcGVydHlOYW1lID0gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FzY2FkZSB2YWx1ZSBmb3IgdGhpcyByb2xlLCBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gbUNhc2NhZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoU3RyaW5nIGNhc2NhZGUpIHsKLQkJaWYgKGNhc2NhZGUgIT0gbnVsbCAmJiBjYXNjYWRlLmxlbmd0aCgpID09IDApIHsKLQkJCWNhc2NhZGUgPSBudWxsOwotCQl9Ci0JCW1DYXNjYWRlID0gY2FzY2FkZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aXZlIHN0cmluZyB1c2VkIGluIGEgY29tbWVudCBpbiB0aGUgZ2VuZXJhdGVkIAotCSAqIGZpbGUgKGZyb20gdGhlIFZlbG9jaXR5IHRlbXBsYXRlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgIHsKLQkJLy88IS0tICRkaXJlY3Rpb25hbGl0eSAkY2FyZGluYWxpdHkgYXNzb2NpYXRpb24gdG8gJHJlZmVyZW5jZWRDbGFzc05hbWUgLS0+Ci0JCVN0cmluZyBkaXJlY3Rpb25hbGl0eTsKLQkJaWYgKGdldEFzc29jaWF0aW9uKCkuZ2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpKSB7Ci0JCQlkaXJlY3Rpb25hbGl0eSA9ICJiaS1kaXJlY3Rpb25hbCI7Ci0JCX0gZWxzZSB7Ci0JCQlkaXJlY3Rpb25hbGl0eSA9ICJ1bmktZGlyZWN0aW9uYWwiOwotCQl9Ci0JCXJldHVybiBkaXJlY3Rpb25hbGl0eSArICIgIiArIGdldEFzc29jaWF0aW9uKCkuZ2V0Q2FyZGluYWxpdHkoKSArICIgYXNzb2NpYXRpb24gdG8gIiArIGdldFJlZmVyZW5jZWRUYWJsZSgpLmdldENsYXNzTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MzFlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Jhc2VFbnRpdHlHZW5DdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgT1JNR2VuQ3VzdG9taXplciBhY2NvcmRpbmcgdG8gSlBBIHNwZWNpZmljYXRpb24gZm9yCi0gKiBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqIAotICogVGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlL2NoYW5nZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSB3aXphcmQgYW5kIGlzIGFsc28KLSAqIHBhc3NlZCBhcyBhIGNvbnRleHQgb2JqZWN0IHRvIFZlbG9jaXR5LgotICovCi1wdWJsaWMgY2xhc3MgQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIgZXh0ZW5kcyBPUk1HZW5DdXN0b21pemVyCi0JaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLQkvKiBtYXBwaW5nIGtpbmRzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX01BUFBJTkdfS0lORCA9ICJiYXNpYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19LSU5EID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX01BUFBJTkdfS0lORCA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiB0aGUgc3RyaW5ncyBmb3IgZ2VuZXJhdG9yIG5hbWVzLiBUaGVzZSBhcHBlYXIgaW4gYSBjb21ibyBib3ggYW5kIHVzZWQgYnkKLQkgKiB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgcHJvY2Vzc2luZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19HRU5FUkFUT1IgPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORV9HRU5FUkFUT1IgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfR0VORVJBVE9SID0gImlkZW50aXR5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBCYXNlRW50aXR5R2VuQ3VzdG9taXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KEZpbGUgZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlci5pbml0KGZpbGUsIHNjaGVtYSk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyAtLS0tLS0gT1JNR2VuQ3VzdG9taXplciBtZXRob2RzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbElkR2VuZXJhdG9ycygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oNSk7Ci0JCS8qIGFkZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3b3VsZCBhcHBlYXIgaW4gdGhlIGNvbWJvICovCi0JCXJlc3VsdC5hZGQoQVVUT19HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKElERU5USVRZX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChUQUJMRV9HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKE5PTkVfR0VORVJBVE9SKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5vSWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBOT05FX0dFTkVSQVRPUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5SWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBJREVOVElUWV9HRU5FUkFUT1I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFNlcXVlbmNlSWRHZW5lcmF0b3JzKCkgewotCQlTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQ8U3RyaW5nPigzKTsKLQkJcmVzdWx0LmFkZChTRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbihDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBEVFBVdGlsLmdldEphdmFUeXBlKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbFByb3BlcnR5VHlwZXMoKSB7Ci0JCS8qCi0JCSAqIEphdmEgcHJpbWl0aXZlIHR5cGVzLCB3cmFwcGVyIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMgLAotCQkgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLm1hdGguQmlnSW50ZWdlciwgamF2YS5tYXRoLkJpZ0RlY2ltYWwsCi0JCSAqIGphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuQ2FsZW5kYXIsIGphdmEuc3FsLkRhdGUsIGphdmEuc3FsLlRpbWUsCi0JCSAqIGphdmEuc3FsLlRpbWVzdGFtcCwgYnl0ZVtdLCBCeXRlW10sIGNoYXJbXSwgQ2hhcmFjdGVyW10sIGVudW1zLCBhbmQKLQkJICogYW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZS4KLQkJICovCi0JCS8vIHJldHVybiBpbiB0aGUgb3JkZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvbWJvCi0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJImJvb2xlYW4iLAotCQkJIkJvb2xlYW4iLAotCQkJImJ5dGUiLAotCQkJIkJ5dGUiLAotCQkJImJ5dGVbXSIsCi0JCQkiY2hhciIsCi0JCQkiY2hhcltdIiwKLQkJCSJDaGFyYWN0ZXIiLAotCQkJIkNoYXJhY3RlcltdIiwKLQkJCSJkb3VibGUiLAotCQkJIkRvdWJsZSIsCi0JCQkiZmxvYXQiLAotCQkJIkZsb2F0IiwKLQkJCSJpbnQiLAotCQkJIkludGVnZXIiLAotCQkJImxvbmciLAotCQkJIkxvbmciLAotCQkJIk9iamVjdCIsCi0JCQkic2hvcnQiLAotCQkJIlNob3J0IiwKLQkJCSJTdHJpbmciLAotCQkJamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS51dGlsLkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEudXRpbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEuc3FsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5zcWwuVGltZS5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MuZ2V0TmFtZSgpCi0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1hcHBpbmdLaW5kcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlCQVNJQ19NQVBQSU5HX0tJTkQsIElEX01BUFBJTkdfS0lORCwgVkVSU0lPTl9NQVBQSU5HX0tJTkQKLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2ljTWFwcGluZ0tpbmQoKSB7Ci0JCXJldHVybiBCQVNJQ19NQVBQSU5HX0tJTkQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZE1hcHBpbmdLaW5kKCkgewotCQlyZXR1cm4gSURfTUFQUElOR19LSU5EOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVkaXRDYXNjYWRlKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55U2lkZUlzQXNzb2NpYXRpb25Pd25lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyAtLS0tIFZlbG9jaXR5IHRlbXBsYXRlcyBtZXRob2RzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXNjYWRlcyBhbm5vdGF0aW9uIG1lbWJlciB2YWx1ZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmUuCi0JICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluc3RlYWQgb2YgbnVsbCBiZWNhdXNlIFZlbG9jaXR5IGRvZXMgbm90IGxpa2UKLQkgKiBudWxsIHdoZW4gdXNlZCBpbiAjc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuQ2FzY2FkZXMoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJTGlzdDxTdHJpbmc+IGNhc2NhZGVzID0gU3RyaW5nVXRpbC5zdHJUb0xpc3Qocm9sZS5nZXRDYXNjYWRlKCksICcsJywgdHJ1ZS8qIHRyaW0gKi8pOwotCQlpZiAoY2FzY2FkZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCggJ3snICk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY2FzY2FkZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlTdHJpbmcgY2FzY2FkZSA9IGNhc2NhZGVzLmdldChpKTsKLQkJCVN0cmluZyBlbnVtU3RyOwotCQkJaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLkFMTF9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuQUxMIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuUEVSU0lTVF9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUEVSU0lTVCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLk1FUkdFX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5NRVJHRSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLlJFTU9WRV9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUkVNT1ZFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXNzZXJ0IChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5SRUZSRVNIX0NBU0NBREUpKTsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLlJFRlJFU0giOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChlbnVtU3RyKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZXRjaCB0eXBlIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZQotCSAqIG51bGwgd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZW5GZXRjaChPUk1HZW5UYWJsZSB0YWJsZSkgewotCQlTdHJpbmcgZmV0Y2ggPSB0YWJsZS5nZXREZWZhdWx0RmV0Y2goKTsKLQkJaWYgKGZldGNoID09IG51bGwgfHwgT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSC5lcXVhbHMoZmV0Y2gpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChmZXRjaC5lcXVhbHMoT1JNR2VuVGFibGUuTEFaWV9GRVRDSCkpIHsKLQkJCXJldHVybiAiRmV0Y2hUeXBlLkxBWlkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIkZldGNoVHlwZS5FQUdFUiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5NDI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLQotLyoqCi0gKiBQcm92aWRlIGEgcGx1Z2dhYmxlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0gKiBwcmludHMgdGhlIG5hbWVzIG9mIHZhcmlvdXMgZGF0YWJhc2Ugb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBlbnRpdHkgYW5kIHRoZSB0YWJsZSB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGVudGl0eSdzCi0JICogVGFibGUgYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgZW50aXR5Ci0JICogbWFwcyB0byB0aGUgdGFibGUgYnkgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlIGNvbHVtbgotCSAqIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiBDb2x1bW4gYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgYXR0cmlidXRlCi0JICogbWFwcyB0byB0aGUgY29sdW1uIGJ5IGRlZmF1bHQuCi0JICovCi0JU3RyaW5nIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbHVtbiBjb2x1bW4pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZQotCSAqIG1hbnktdG8tb25lIG9yIG1hbnktdG8tbWFueSBmb3JlaWduIGtleSB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JICogSm9pbkNvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBqb2luIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luQ29sdW1uCi0JICogYW5ub3RhdGlvbidzICduYW1lJyBvciAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQuCi0JICogVGhpcyBpcyBjYWxsZWQgZm9yIG1hbnktdG8tb25lIGFuZCBtYW55LXRvLW1hbnkgbWFwcGluZ3Mgd2hlbgotCSAqIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5hbWUgYW5kL29yIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYXJlL2lzCi0JICogbm90IGFwcGxpY2FibGUuCi0JICogQHNlZSBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcsIEZvcmVpZ25LZXkpCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luVGFibGUKLQkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuCi0JICogVGhpcyBpcyBjYWxsZWQgZm9yIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuIHRoZSBkZWZhdWx0Ci0JICogam9pbiB0YWJsZSBuYW1lIGlzIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCVN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKTsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGxlIHJldHVybnMgdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUsCi0JICogdW5hbHRlcmVkLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0YWJsZS5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gY29sdW1uLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJCXJldHVybiBmb3JlaWduS2V5LmdldENvbHVtblBhaXIoKS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIGNvbHVtbi5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5EZWZhdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODJjZTYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqLwotY2xhc3MgSnB0R2VuTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5TY29wZV90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmF0b3JfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVtcGxhdGVzX25vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2dlbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRHZW5NZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIEpwdEdlbk1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQwYzIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSnB0R2VuUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmdlbiI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbiAoIFN0cmluZyBtc2csIFRocm93YWJsZSBlICkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCUlMb2cgbG9nID0gUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSk7Ci0JCWxvZy5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1zZywgZSApKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCUlMb2cgbG9nID0gUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSk7Ci0JCWxvZy5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIHN0YXR1cy5nZXRNZXNzYWdlKCksIGNlKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3N2QwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5FbnRpdHlHZW5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIE9STSBnZW5lcmF0aW9uIHByb3BlcnRpZXMgZm9yIGEgZGF0YWJhc2UgCi0gKiBjb2x1bW4uCi0gKiAKLSAqIDxwPlRoaXMgaXMgZGVzaWduZWQgdG8gYmUgY3JlYXRlZC9jaGFuZ2VkIGJ5IHRoZSBnZW5lcmF0aW9uIHdpemFyZCwKLSAqIGFuZCBnZW5lcmF0ZWQgdXNpbmcgVmVsb2NpdHkgdGVtcGxhdGVzLgotICogVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlIHBlcnNpc3RlZC9yZXRyaWV2ZWQgdXNpbmcgCi0gKiA8Y29kZT5PUk1HZW5DdXN0b21pemVyPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT1JNR2VuQ29sdW1uCi17Ci0JcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0JcHJpdmF0ZSBDb2x1bW4gbURiQ29sdW1uOwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIE9STUdlblRhYmxlIG1HZW5UYWJsZTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQV9MQU5HX1BBQ0tBR0UgPSAiamF2YS5sYW5nLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgT1JNR2VuQ29sdW1uKENvbHVtbiBkYkNvbHVtbiwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltRGJDb2x1bW4gPSBkYkNvbHVtbjsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltVGFibGUgPSBkYkNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdlblRhYmxlKE9STUdlblRhYmxlIG9ybUdlblRhYmxlKSB7Ci0JCW1HZW5UYWJsZSA9IG9ybUdlblRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZWQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHkocHJvcE5hbWUsIG1UYWJsZS5nZXROYW1lKCksIGdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJZ2V0Q3VzdG9taXplcigpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lLCBib29sZWFuIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoZGVmYXVsdFZhbHVlID09IHZhbHVlKSB7Ci0JCQlzZXRDdXN0b21pemVkKHByb3BOYW1lLCBudWxsKTsgLy9yZW1vdmUgdGhlIHByb3BlcnR5Ci0JCX0gZWxzZSB7Ci0JCQlnZXRDdXN0b21pemVyKCkuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUobURiQ29sdW1uLmdldE5hbWUoKSwgbURiQ29sdW1uKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYkNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uTmFtZSgpewotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShtRGJDb2x1bW4pOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogbURiQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgYmVhbiBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgotCSAqIERvZXMgbm90IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vbmFtZSA9IFN0cmluZ1V0aWwuY29sdW1uTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCkpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhuYW1lLCBnZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSwgbmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKXsKLQkJcmV0dXJuIGlzRGVmYXVsdG5hbWUoKSAmJiBpc1VwZGF0ZWFibGUoKSAmJiBpc0luc2VydGFibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCl7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZSgpOwotLy8JCVN0cmluZyBkYkNvbHVtbk5hbWUgPSBnZXROYW1lKCk7Ci0vLwkJcmV0dXJuIHByb3BOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIGRiQ29sdW1uTmFtZSApOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZENvbHVtbkFubm90YXRpb25OYW1lKHByb3BOYW1lLCB0aGlzLm1EYkNvbHVtbiApOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU9PW51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHR5cGUuCi0JICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGUoKSAgewotCQlTdHJpbmcgdHlwZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfVFlQRSk7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbiggdGhpcy5tRGJDb2x1bW4gKTsKLQkJfQotCQlpZiggdHlwZS5zdGFydHNXaXRoKEpBVkFfTEFOR19QQUNLQUdFKSApIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyggSkFWQV9MQU5HX1BBQ0tBR0UubGVuZ3RoKCkgKTsKLQkJfQotCQlpZiggdHlwZS5lcXVhbHMoImphdmEuc3FsLkRhdGUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSAiamF2YS51dGlsLkRhdGUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVQcm9wZXJ0eVR5cGUoKSAgewotCQlyZXR1cm4gbUdlblRhYmxlLmdldFNpbXBsaWZpZWRDb2xUeXBlKCBnZXRQcm9wZXJ0eVR5cGUoKSApOwotCX0JCi0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlUeXBlKFN0cmluZyB0eXBlKSAgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHR5cGUsIGdldFByb3BlcnR5VHlwZSgpKSkgewotCQkJc2V0Q3VzdG9taXplZChQUk9QRVJUWV9UWVBFLCB0eXBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbHVtbiB0eXBlIGlzIG51bWVyaWMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkgewotCQlib29sZWFuIHJldCA9IHRoaXMubURiQ29sdW1uLmlzTnVtZXJpYygpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXBwaW5nIGtpbmQsIG9uZSBvZiB7QGxpbmsgI1BST1BFUlRZX01BUFBJTkdfS0lORH18e0BsaW5rICNJRF9NQVBQSU5HX0tJTkR9Ci0JICogfHtAbGluayAjVkVSU0lPTl9NQVBQSU5HX0tJTkR9fHtAbGluayAjVElNRVNUQU1QX01BUFBJTkdfS0lORH0uCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvIGJhc2ljIHByb3BlcnR5IHR5cGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tpbmQoKSB7Ci0JCVN0cmluZyBraW5kID0gY3VzdG9taXplZChNQVBQSU5HX0tJTkQpOwotCQlpZiAoa2luZCA9PSBudWxsKSB7Ci0JCQlraW5kID0gZ2V0Q3VzdG9taXplcigpLmdldEJhc2ljTWFwcGluZ0tpbmQoKTsKLQkJCQotCQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSAKLQkJCQkgJiYgdGhpcy5tRGJDb2x1bW4uZ2V0VGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA9PSAxKSB7Ci0JCQkJa2luZCA9IGdldEN1c3RvbWl6ZXIoKS5nZXRJZE1hcHBpbmdLaW5kKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdLaW5kKFN0cmluZyBtYXBwaW5nS2luZCkgIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhtYXBwaW5nS2luZCwgZ2V0TWFwcGluZ0tpbmQoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoTUFQUElOR19LSU5ELCBtYXBwaW5nS2luZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzTnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCWlmICggdGhpcy5tRGJDb2x1bW4uaXNOdW1lcmljKCkpewotCQkJcmV0dXJuIG1EYkNvbHVtbi5nZXRQcmVjaXNpb24oKTsKLQkJfQotCQlyZXR1cm4gbURiQ29sdW1uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVjaW1hbERpZ2l0cygpIHsKLQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc051bWVyaWMoKSApewotCQkJcmV0dXJuIG1EYkNvbHVtbi5nZXRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpICYmCi0JCQkJdGhpcy5tVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPiAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChQUk9QRVJUWV9ERVNDKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZUxPQigpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzTE9CKCk7Ci0JfQkKLQotCXB1YmxpYyBib29sZWFuIGlzTmVlZE1hcFRlbXBvcmFsVHlwZSgpIHsKLQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCXJldHVybiAoIHByb3BlcnR5VHlwZS5lcXVhbHMoImphdmEudXRpbC5EYXRlIikgfHwgcHJvcGVydHlUeXBlLmVxdWFscygiamF2YS51dGlsLkNhbGVuZGFyIikgKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUZW1wb3JhbFR5cGUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0VHlwZSA9IGdldEN1c3RvbWl6ZXIoKS5nZXRQcm9wZXJ0eVR5cGVGcm9tQ29sdW1uKCB0aGlzLm1EYkNvbHVtbiApOwotCQlpZiggZGVmYXVsdFR5cGUuZXF1YWxzKCJqYXZhLnNxbC5EYXRlIikpeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIkRBVEUiOyAvLyROT04tTkxTLTEkCi0JCX1lbHNlIGlmKCBkZWZhdWx0VHlwZS5lcXVhbHMoImphdmEuc3FsLlRpbWUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiVElNRSI7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgewotCQkJcmV0dXJuICJUSU1FU1RBTVAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBwcm9wZXJ0eSBnZXR0ZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlHZXRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChQUk9QRVJUWV9HRVRfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQVUJMSUNfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUdldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHNjb3BlLCBnZXRQcm9wZXJ0eUdldFNjb3BlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX0dFVF9TQ09QRSwgc2NvcGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBwcm9wZXJ0eSBzZXR0ZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlTZXRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChQUk9QRVJUWV9TRVRfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQVUJMSUNfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHNjb3BlLCBnZXRQcm9wZXJ0eVNldFNjb3BlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX1NFVF9TQ09QRSwgc2NvcGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBmaWVsZCBtZW1iZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwcml2YXRlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkU2NvcGUoKSB7Ci0JCVN0cmluZyBzY29wZSA9IGN1c3RvbWl6ZWQoRklFTERfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQUklWQVRFX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGluIHRoZSAKLQkgKiA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUluRXF1YWxzKCkgIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9FUVVBTFMpIHx8IGlzUHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VJbkVxdWFscyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9FUVVBTFMsIHZhbHVlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbHVtbiBzaG91bGQgYmUgdXNlZCBpbiB0aGUgCi0JICogPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUluVG9TdHJpbmcoKSAgewotCQlyZXR1cm4gY3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX1RPX1NUUklORykgfHwgaXNQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUluVG9TdHJpbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihVU0VfSU5fVE9fU1RSSU5HLCB2YWx1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoY3VzdG9taXplZChVUERBVEVBQkxFKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZSAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZWFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihVUERBVEVBQkxFLCB2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKElOU0VSVEFCTEUpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKElOU0VSVEFCTEUsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWQoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoY3VzdG9taXplZChHRU5FUkFURUQpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oR0VORVJBVEVELCB2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAibmFtZT0iICsgZ2V0TmFtZSgpICsgIjsgdHlwZT0iICsgZ2V0UHJvcGVydHlUeXBlKCkgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCi0JLypnZXQvc2V0IGFuZCBmaWVsZCBzY29wZXMqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ09QRSA9ICJwdWJsaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVEVDVEVEX1NDT1BFID0gInByb3RlY3RlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFX1NDT1BFID0gInByaXZhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKmN1c3RvbWl6YXRpb24gcHJvcGVydGllcyovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RZUEUgPSAicHJvcGVydHlUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfS0lORCA9ICJtYXBwaW5nS2luZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVTQyA9ICJwcm9wZXJ0eURlc2MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0dFVF9TQ09QRSA9ICJwcm9wZXJ0eUdldFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRVRfU0NPUEUgPSAicHJvcGVydHlTZXRTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfU0NPUEUgPSAiZmllbGRTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0lOX0VRVUFMUyA9ICJ1c2VJbkVxdWFscyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0lOX1RPX1NUUklORyA9ICJ1c2VJblRvU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVBQkxFID0gInVwZGF0ZWFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEID0gImdlblByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5DdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5ZWYzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRm9yZWlnbktleUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gY3VzdG9taXplIHRoZSBkYXRhYmFzZSBzY2hlbWEgdG8gT1JNIGVudGl0eSAKLSAqIGdlbmVyYXRpb24uCi0gKiAKLSAqIDxwPlRoZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIGFyZSBtYWlubHkgZXhwb3NlZCBpbiB0aGUgZm9ybSBvZiAKLSAqIHByb3BlcnRpZXMuIFRoZXJlIGFyZSBubyBhc3N1bXB0aW9ucyBpbiB0aGlzIGNsYXNzIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRoZSAKLSAqIHByb3BlcnR5IG5hbWVzLiBQcm9wZXJ0aWVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIHNwZWNpZmljIHRhYmxlcyBhbmQgdGFibGUgCi0gKiBjb2x1bW5zLCBvciBnbG9iYWxseSBmb3IgYW55IHRhYmxlIGFuZC9vciBjb2x1bW4uCi0gKiAKLSAqIDxwPlN1YmNsYXNzIGNhbiBpbXBsZW1lbnQgdGhlIHNldHMgb2YgYWJzdHJhY3QgbWV0aG9kcyB0byBwcm92aWRlIE9STSB2ZW5kb3IKLSAqIHNwZWNpZmljIHByb3BlcnRpZXMuCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9STUdlbkN1c3RvbWl6ZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIHBhc3NlZCBmb3IgdGhlIHRhYmxlIG5hbWUgYXJndW1lbnQgdG8gZ2V0L3NldFByb3BlcnR5IAotCSAqIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgYXBwbGllcyB0byBhbnkgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX1RBQkxFID0gIl9fYW55VGFibGVfXyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRERMX0FOTk9UQVRJT04gPSAiZ2VuZXJhdGVERExBbm5vdGF0aW9ucyI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCB0YWJsZSB2YWx1ZS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1RBQkxFID0gIiI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCBjb2x1bW4gdmFsdWUuKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9DT0xVTU4gPSAiIjsKLQkKLQkvKlRoaXMgdmVyc2lvbiBudW1iZXIgaXMgd3JpdHRlbiBpbiB0aGUgaGVhZGVyIG9mIHRoZSBjdXN0b21pemF0aW9uIHN0cmVhbQotCSAqIGFuZCByZWFkIGF0IGRlLXNlcmlhbGl6YXRpb24gdGltZSwgaWYgaXQgaXMgZGlmZmVyZW50IHRoZW4gdGhlIGZpbGUgaXMgaW52YWxpZGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVkVSU0lPTiA9IDI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9DT05GSUdfRklMRSA9ICJ1cGRhdGVDb25maWdGaWxlIjsKLQotCXByaXZhdGUgdHJhbnNpZW50IFNjaGVtYSBtU2NoZW1hOwotCXByaXZhdGUgdHJhbnNpZW50IEZpbGUgbUZpbGU7Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRhYmxlTmFtZXM7Ci0JLyprZXk6IHRhYmxlIG5hbWUsIHZhbHVlOiBPUk1HZW5UYWJsZSBvYmplY3QuKi8KLQlwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nICwgT1JNR2VuVGFibGU+IG1UYWJsZXM7Ci0JLyp0aGUgPGNvZGU+QXNzb2NpYXRpb248L2NvZGU+IG9iamVjdHMgc29ydGVkIGJ5IHRoZWlyICJmcm9tIiAKLQkgKiB0YWJsZSBuYW1lLiBJbmNsdWRlcyBhbGwgYXNzb2NpYXRpb24gZGVyaXZlZCBmcm9tIGZvcmVpZ24ga2V5cyAKLQkgKiBpbiB1c2VyIHNlbGVjdGVkIHRhYmxlcy4gU2luY2Ugc29tZSBvZiB0aGUgZm9yZWlnbiBrZXlzIG1heSBwb2ludCB0byB0YWJsZQotCSAqIHVzZXIgZG9lcyBub3Qgc2VsZWN0LCB0aGlzIGxpc3QgbWF5IGJlIGRpZmZlcmVudCBmcm9tICBtVmFsaWRBc3NvY2lhdGlvbnMKLQkgKi8KLQlwcml2YXRlIExpc3Q8QXNzb2NpYXRpb24+IG1Bc3NvY2lhdGlvbnM7Ci0JLyoKLQkgKiBMaXN0IG9mIHZhbGlkIGFzc29jaWF0aW9ucyB3aXRoaW4gdGhlIHVzZXIgc2VsZWN0ZWQgdGFibGVzICAKLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PEFzc29jaWF0aW9uPiBtVmFsaWRBc3NvY2lhdGlvbnM7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBtSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnM7Ci0JCi0JLyp0aGUgcHJvcGVydHkgbmFtZSBpcyBpbiB0aGUgZm9ybSAkdGFibGVOYW1lLiRjb2x1bW5OYW1lLiRwcm9wZXJ0eU5hbWUuCi0JICogV2hlcmUgdGFibGVOYW1lIGNvdWxkIGJlIE5VTExfVEFCTEUgb3IgQU5ZX1RBQkxFCi0JICogYW5kIGNvbHVtbk5hbWUgY291bGQgYmUgTlVMTF9DT0xVTU4qLwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcHMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQuSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdHJ1ZTsKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIGFic3RyYWN0IG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHByaW1hcnkga2V5IGdlbmVyYXRvciBzY2hlbWVzLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8U3RyaW5nPiBnZXRBbGxJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXZlbG9wZXItYXNzaWduZWQgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb0lkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgaWRlbnRpdHkgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZGVudGl0eUlkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvcnMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU2V0PFN0cmluZz4gZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgdHlwZSBmcm9tIHRoZSBnaXZlbiBkYXRhYmFzZSBjb2x1bW4uCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oQ29sdW1uIGNvbHVtbikgOwotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyBwcm9wZXJ0eSB0eXBlcy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRBbGxQcm9wZXJ0eVR5cGVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHByb3BlcnR5IG1hcHBpbmcga2luZHMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0QWxsTWFwcGluZ0tpbmRzKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzaWMgKGRlZmF1bHQpIHByb3BlcnR5IG1hcHBpbmcga2luZC4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzaWNNYXBwaW5nS2luZCgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIChwcmltYXJ5IGtleSkgcHJvcGVydHkgbWFwcGluZyBraW5kLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZE1hcHBpbmdLaW5kKCk7Ci0JLyoqCi0JICogSW50ZXJhY3RzIHdpdGggdGhlIHVzZXIgdG8gZWRpdCB0aGUgY2FzY2FkZSBvZiB0aGUgZ2l2ZW4gCi0JICogcm9sZS4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWxzbyBjYWxsIDxjb2RlPkFzc29jaWF0aW9uUm9sZS5zZXRDYXNjYWRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSB1c2VyIGludGVyYWN0aW9uIGlzIGNhbmNlbGxlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZGl0Q2FzY2FkZShBc3NvY2lhdGlvblJvbGUgcm9sZSk7Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MuCi0JICogVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBuZWNlc3Nhcnkgd2hlbiB0aGUgPGNvZGU+c2F2ZTwvY29kZT4gCi0JICogbWV0aG9kIGlzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCBGaWxlIGZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5tU2NoZW1hID0gc2NoZW1hOwotCQltRmlsZSA9IGZpbGU7Ci0JCQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXNldFByb3BlcnR5KE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlbkN1c3RvbWl6ZXIuQU5ZX1RBQkxFLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKLQkJdHJ5IAotCQl7Ci0JCQkvL3JlYWQgaXQgaW4gYSBmaWxlIGZpcnN0IHRvIHNwZWVkdXAgZGVzZXJpYWxpemF0aW9uCi0JCQlieXRlW10gYnl0ZXMgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlKTsKLQkJCWlzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGlzdHJlYW0pOwotCQkJCi0JCQlGaWxlSGVhZGVyIGhlYWRlciA9IChGaWxlSGVhZGVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQlpZiAoaGVhZGVyLm1WZXJzaW9uID09IEZJTEVfVkVSU0lPTikgewotCQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IChPUk1HZW5DdXN0b21pemVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJcmVzdG9yZShjdXN0b21pemVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKk9STUdlbkN1c3RvbWl6ZXIubG9hZCBmYWlsZWQgIitmaWxlKyI6ICIgKyBleCk7CQkJCQotCQl9Ci0JCWZpbmFsbHkgCi0JCXsKLQkJCWlmIChvaXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkgCi0JCQkJewotCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoaXN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCXRyeSAKLQkJCQl7Ci0JCQkJCWlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIHRoaXMubUZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTY2hlbWEgc2NoZW1hKXsKLQkJdGhpcy5tU2NoZW1hID0gc2NoZW1hOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCl7Ci0JCXJldHVybiBtU2NoZW1hOwotCX0KLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VzdG9taXphdGlvbiBmaWxlLgotCSAqIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tT1JNR2VuQ3VzdG9taXplci5zYXZlOiAiICsgbUZpbGUpOwotCQlpZiAoIW1GaWxlLmV4aXN0cygpICYmICFtRmlsZS5jcmVhdGVOZXdGaWxlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKLQkJYm9vbGVhbiBkZWxldGVJdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKG1GaWxlKTsKLQkJCW9vcyA9IG5ldyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShmb3MpOwotCQkJRmlsZUhlYWRlciBoZWFkZXIgPSBuZXcgRmlsZUhlYWRlcigpOwotCQkJb29zLndyaXRlT2JqZWN0KGhlYWRlcik7Ci0JCQlvb3Mud3JpdGVPYmplY3QodGhpcyk7Ci0JCQlkZWxldGVJdCA9IGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vZGVsZXRlSXQgaXMgdHJ1ZSwgc28gdGhlIGNhY2hlIGlzIG5vdCBzYXZlZC4KLQkJCUNvcmVFeGNlcHRpb24gY2UgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCSJVbmFibGUgdG8gc2F2ZSB0aGUgT1JNR2VuQ3VzdG9taXplciBmaWxlOiAiK21GaWxlLGV4KSk7Ci0JCQlKcHRHZW5QbHVnaW4ubG9nRXhjZXB0aW9uKCBjZSApOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAob29zIT1udWxsKSBvb3MuY2xvc2UoKTsKLQkJCQlpZiAoZm9zIT1udWxsKSBmb3MuY2xvc2UoKTsKLQkJCQlpZiAoZGVsZXRlSXQpIHsKLQkJCQkJbUZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleDIpIHt9CQotCQl9Ci0JfQotCQotCXB1YmxpYyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBnZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKSB7Ci0JCWlmIChkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImRhdGFiYXNlIGFubm90YXRpb24gbmFtZSBidWlsZGVyIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5kYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHtAbGluayAjR0VORVJBVEVfRERMX0FOTk9UQVRJT059ICBpbmRpY2F0aW5nIHdoZXRoZXIKLQkgKiB0aGUgb3B0aW9uYWwgRERMIHBhcmFtZXRlcnMgbGlrZSBsZW5ndGgsIG51bGxhYmxlLCB1bnFpdWUsIGV0YyBzaG91bGQgYmUgZ2VuZXJhdGVkIAotCSAqIGluIEBDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBkZWZhdWx0cyB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRERMQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKGdldFByb3BlcnR5KEdFTkVSQVRFX0RETF9BTk5PVEFUSU9OLCBBTllfVEFCTEUsIG51bGwpKTsgLy9kZWZhdWx0cyB0byBmYWxzZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRQcm9wS2V5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJU3RyaW5nIHZhbHVlID0gbVByb3BzLmdldChrZXkpOwotCQkvKmlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgYW5kIGl0IGlzIGEgdGFibGUgcHJvcGVydHkgdGhlbiAKLQkJICogZ2V0IHRoZSBkZWZhdWx0IHRhYmxlIHByb3BlcnR5LiovCi0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHRhYmxlTmFtZSAhPSBudWxsICYmIGNvbE5hbWUgPT0gbnVsbCAmJiAhdGFibGVOYW1lLmVxdWFscyhBTllfVEFCTEUpKSB7Ci0JCQl2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgQU5ZX1RBQkxFLCBjb2xOYW1lKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgYSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSwgY291bGQgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRQcm9wS2V5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCW1Qcm9wcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQltUHJvcHMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgI2dldFByb3BlcnR5KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfSBidXQgCi0JICogY29udmVydHMgdGhlIHZhbHVlIHRvIGJvb2xlYW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHModmFsdWUpOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIGEgdGFibGUgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiB2YWx1ZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0YWJsZXMgdG8gZ2VuZXJhdGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gbVRhYmxlTmFtZXMgIT0gbnVsbCA/IG1UYWJsZU5hbWVzIDogamF2YS51dGlsLkNvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZldGNoIHR5cGUgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWUsIG9yIGVtcHR5IHN0cmluZyAKLQkgKiBpZiBub25lLgotCSAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIG51bGwgYmVjYXVzZSBWZWxvY2l0eSBkb2VzIG5vdCBsaWtlIG51bGwgCi0JICogd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5GZXRjaChPUk1HZW5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gIiI7Ci0JfQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgdGFibGUgdXNlciBzZWxlY3Rpb24gaXMgY2hhbmdlZCBpbiB0aGUgCi0JICogZ2VuZXJhdGlvbiB3aXphcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVOYW1lcyhMaXN0PFN0cmluZz4gdGFibGVOYW1lcykgewotCQltVGFibGVOYW1lcyA9IHRhYmxlTmFtZXM7Ci0JCW1UYWJsZXMgPSBudWxsOwotCQltVmFsaWRBc3NvY2lhdGlvbnMgPSBudWxsOyAvL3JlY29tcHV0ZQotCQltSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnMgPSB0cnVlOyAvL21ha2Ugc3VyZSBmb3JlaWduIGFzc29jaWF0aW9ucyBmcm9tIG5ld2x5IGFkZGVkIHRhYmxlcyBhcmUgY29tcHV0ZWQuCi0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIG5hbWVzIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBUaGlzIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIDxjb2RlPmdldFRhYmxlTmFtZXM8L2NvZGU+IGlmIHRoZXJlIAotCSAqIGFyZSBtYW55LXRvLW1hbnkgam9pbiB0YWJsZXMgYW5kIGFyZSBub3QgY29udHJpYnV0aW5nIAotCSAqIGluIGFueSBvdGhlciBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHZW5UYWJsZU5hbWVzKCkgIHsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gZ2V0VGFibGVOYW1lcygpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPihuYW1lcy5zaXplKCkpOwotCQkKLQkJLypmaWx0ZXIgb3V0IGpvaW4gdGFibGVzKi8KLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiB0YWJsZU5hbWVzSXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7IHRhYmxlTmFtZXNJdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gdGFibGVOYW1lc0l0ZXIubmV4dCgpOwotCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCQotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gYXNzb2NJdGVyID0gYXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IGFzc29jSXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gYXNzb2NJdGVyLm5leHQoKTsKLQkJCQlpZiAoIWFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICh0YWJsZU5hbWUuZXF1YWxzKGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGVOYW1lKCkpCi0JCQkJCQl8fCB0YWJsZU5hbWUuZXF1YWxzKGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSkpIHsKLQkJCQkJaXNWYWxpZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCkpKSB7Ci0JCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNWYWxpZCkgewotCQkJCXJlc3VsdC5hZGQodGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIDxjb2RlPk9STUdlblRhYmxlPC9jb2RlPiBvYmplY3QgZ2l2ZW4gaXRzIG5hbWUsIG9yIAotCSAqIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0VGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgIHsKLQkJaWYgKG1UYWJsZXMgPT0gbnVsbCkgewotCQkJbVRhYmxlcyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIE9STUdlblRhYmxlPihtVGFibGVOYW1lcy5zaXplKCkpOwotCQl9Ci0JCQotCQlpZihtVGFibGVOYW1lcyE9bnVsbCAmJiBtU2NoZW1hIT1udWxsKXsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbVRhYmxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCVN0cmluZyBuYW1lID0gaXRlci5uZXh0KCk7Ci0JCQkJVGFibGUgZGJUYWJsZSA9IG1TY2hlbWEuZ2V0VGFibGVOYW1lZCggbmFtZSApOwotCQkJCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCQkJbVRhYmxlcy5wdXQobmFtZSwgY3JlYXRlR2VuVGFibGUoZGJUYWJsZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbVRhYmxlcy5nZXQodGFibGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QXNzb2NpYXRpb248L2NvZGU+IG9iamVjdHMgc29ydGVkIGJ5IHRoZWlyICJmcm9tIiAKLQkgKiB0YWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0PEFzc29jaWF0aW9uPiBnZXRBc3NvY2lhdGlvbnMoKXsKLQkJcmV0dXJuIGdldEFzc29jaWF0aW9ucyh0cnVlLyp2YWxpZE9ubHkqLyk7Ci0JfQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGFzc29jaWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFzc29jaWF0aW9uKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSAgewotCQlnZXRBc3NvY2lhdGlvbnMoZmFsc2UvKnZhbGlkT25seSovKS5hZGQoYXNzb2NpYXRpb24pOwotCQlpZiAobVZhbGlkQXNzb2NpYXRpb25zICE9IG51bGwpIHsKLQkJCW1WYWxpZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQl9Ci0JCQotCX0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBnaXZlbiBhc3NvY2lhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVBc3NvY2lhdGlvbihBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgIHsKLQkJYm9vbGVhbiByZW1vdmVkID0gZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJYXNzZXJ0KHJlbW92ZWQpOwotCQkKLQkJaWYgKG1WYWxpZEFzc29jaWF0aW9ucyAhPSBudWxsKSB7Ci0JCQlyZW1vdmVkID0gbVZhbGlkQXNzb2NpYXRpb25zLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCQlhc3NlcnQocmVtb3ZlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuIGFzc29jaWF0aW9uIHNpbWlsYXIgdG8gdGhlIGdpdmVuIGFzc29jaWF0aW9uIAotCSAqIGFscmVhZHkgZXhpc3RzLgotCSAqIFRoaXMgaXMgZGVjaWRlZCBiYXNlZCBvbmx5IG9uIHRoZSBhc3NvY2lhdGlvbiB0YWJsZXMgYW5kIGNvbHVtbnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdGVyID0gZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uMiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmICghYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyVGFibGVOYW1lKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKQotCQkJCQkJfHwgIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGFzc29jaWF0aW9uLmdldEpvaW5UYWJsZU5hbWUoKSwgYXNzb2NpYXRpb24yLmdldEpvaW5UYWJsZU5hbWUoKSkKLQkJCQkJCXx8ICFhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSkKLQkJCQkJCSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9CQkJCQkKLQkJCQkvKnRoZSAyIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgcmVmZXJyZXIsIHJlZmVyZW5jZWQgYW5kIGpvaW4gdGFibGUqLwotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpKQotCQkJCQkJJiYgYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5PUk1HZW5UYWJsZTwvY29kZT4gaW5zdGFuY2UuIAotCSAqLwotCXB1YmxpYyBPUk1HZW5UYWJsZSBjcmVhdGVHZW5UYWJsZShUYWJsZSBkYlRhYmxlKSB7Ci0JCXJldHVybiBuZXcgT1JNR2VuVGFibGUoZGJUYWJsZSwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIE9STUdlbkNvbHVtbiBjcmVhdGVHZW5Db2x1bW4oQ29sdW1uIGRiQ29sKSB7Ci0JCXJldHVybiBuZXcgT1JNR2VuQ29sdW1uKGRiQ29sLCB0aGlzKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIHNwZWNzIHJlcXVpcmUgdGhlICJtYW55IiBzaWRlIAotCSAqIG9mIGFuIGFzc29jaWF0aW9uIHRvIGJlIHRoZSBvd25lciAobGlrZSBFSkIzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55U2lkZUlzQXNzb2NpYXRpb25Pd25lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNvbmZpZ0ZpbGUoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoZ2V0UHJvcGVydHkoVVBEQVRFX0NPTkZJR19GSUxFLCBudWxsLCBudWxsKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZQotCX0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDb25maWdGaWxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlKSB7IC8vZGVmYXVsdCBpcyB0cnVlCi0JCQlzZXRQcm9wZXJ0eShVUERBVEVfQ09ORklHX0ZJTEUsIG51bGwsIG51bGwsIG51bGwpOyAvL3JlbW92ZSBpdAotCQl9IGVsc2UgewotCQkJc2V0Qm9vbGVhblByb3BlcnR5KFVQREFURV9DT05GSUdfRklMRSwgdmFsdWUsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBWZWxvY2l0eSB0ZW1wbGF0ZXMgbWV0aG9kcwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZ2V0dGVyIG1ldGhvZCBuYW1lIGdpdmVuIGEgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5R2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJnZXQiK1N0cmluZ1V0aWwuaW5pdFVwcGVyKHByb3BlcnR5TmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBzZXR0ZXIgbWV0aG9kIG5hbWUgZ2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gInNldCIrU3RyaW5nVXRpbC5pbml0VXBwZXIocHJvcGVydHlOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgcykgewotCQlyZXR1cm4gU3RyaW5nVXRpbC5xdW90ZShzLCAnIicpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHF1b3RlKGJvb2xlYW4gYikgewotCQlyZXR1cm4gcXVvdGUoU3RyaW5nLnZhbHVlT2YoYikpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHF1b3RlKGludCBpKSB7Ci0JCXJldHVybiBxdW90ZShTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCS8qKgotCSAqIEFwcGVuZHMgYW4gYW5ub3RhdGlvbiBtZW1iZXIgbmFtZSBhbmQgdmFsdWUgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcyBUaGUgYW5ub3RhdGlvbiBtZW1iZXJzIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBtZW1iZXJWYWx1ZSBUaGUgbWVtYmVyIHZhbHVlLCBpZiBudWxsIG9yIGVtcHR5IHN0cmluZ3MgdGhlbiAKLQkgKiBub3RoaW5nIGlzIGFwcGVuZWQuCi0JICogCi0JICogQHBhcmFtIHdoZXRoZXIgdG8gZG91YmxlIHF1b3RlIHRoZSBtZW1iZXIgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBhcHBlbmRBbm5vdGF0aW9uKFN0cmluZyBzLCBTdHJpbmcgbWVtYmVyTmFtZSwgU3RyaW5nIG1lbWJlclZhbHVlLCBib29sZWFuIHF1b3RlKSB7Ci0JCWlmIChtZW1iZXJWYWx1ZSA9PSBudWxsIHx8IG1lbWJlclZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChtZW1iZXJOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQlpZiAocXVvdGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG1lbWJlclZhbHVlKTsKLQkJaWYgKHF1b3RlKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0pESzFfNSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gcHJpdmF0ZSBtZXRob2RzCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIAotCSAqIChwZXJzaXN0ZWQpIGN1c3RvbWl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmUoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSAgewotCQltVGFibGVOYW1lcyA9IGN1c3RvbWl6ZXIubVRhYmxlTmFtZXM7Ci0JCW1Bc3NvY2lhdGlvbnMgPSBjdXN0b21pemVyLm1Bc3NvY2lhdGlvbnM7Ci0JCW1Qcm9wcyA9IGN1c3RvbWl6ZXIubVByb3BzOwotCQltVXBkYXRlUGVyc2lzdGVuY2VYbWwgPSBjdXN0b21pemVyLm1VcGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQkJaWYoIG1TY2hlbWEgPT0gbnVsbCApCi0JCQlyZXR1cm47Ci0JCQotCQkvKnJlbW92ZSBpbnZhbGlkIHRhYmxlIG5hbWVzKi8KLQkJZm9yIChpbnQgaSA9IG1UYWJsZU5hbWVzLnNpemUoKS0xOyBpID49IDA7IC0taSkgewotCQkJU3RyaW5nIHRhYmxlTmFtZSA9IG1UYWJsZU5hbWVzLmdldChpKTsKLQkJCWlmIChtU2NoZW1hLmdldFRhYmxlTmFtZWQoIHRhYmxlTmFtZSkgPT0gbnVsbCkgewotCQkJCW1UYWJsZU5hbWVzLnJlbW92ZShpKTsKLQkJCX0KLQkJfQotCQlpZiggbUFzc29jaWF0aW9ucyE9bnVsbCApewotCQkJLypyZXN0b3JlIHRoZSBhc3NvY2lhdGlvbnMqLwotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IG1Bc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRpb24ucmVzdG9yZSh0aGlzKTsKLQkJCX0KLQkJCS8qYWRkIHRoZSBmb3JlaWduIGtleXMgYXNzb2NpYXRpb25zIGp1c3QgaW4gY2FzZSB0aGUgdGFibGVzIGNoYW5nZWQgc2luY2UgCi0JCQkgKiB0aGUgbGFzdCB0aW1lIHRoZSBzdGF0ZSB3YXMgcGVyc2lzdGVkLiBQYXNzIGNoZWNrRXhpc3RpbmcgdHJ1ZSBzbyB0aGF0IHRoZSAKLQkJCSAqIGFzc29jaWF0aW9ucyByZXN0b3JlZCBhYm92ZSBhcmUgbm90IG92ZXJ3cml0dGVuLiovCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRydWUvKmNoZWNrRXhpc3RpbmcqLyk7Ci0JCQkvLyBzb3J0IG9uIHJlc3RvcmUKLQkJCXNvcnRBc3NvY2lhdGlvbnMoIG1Bc3NvY2lhdGlvbnMgKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBrZXkgaW4gbVByb3BzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCAKLQkgKiBwcm9wZXJ0eU5hbWUsIHRhYmxlIGFuZCBjb2x1bW4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcEtleShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlpZiAodGFibGVOYW1lID09IG51bGwpIHsKLQkJCXRhYmxlTmFtZSA9IE5VTExfVEFCTEU7Ci0JCX0KLQkJaWYgKGNvbE5hbWUgPT0gbnVsbCkgewotCQkJY29sTmFtZSA9IE5VTExfQ09MVU1OOwotCQl9Ci0JCXJldHVybiB0YWJsZU5hbWUgKyAnLicgKyBjb2xOYW1lICsgJy4nICsgcHJvcGVydHlOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbnMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSAKLQkgKiBjdXJyZW50IHRhYmxlcy4KLQkgKi8KLQlwcml2YXRlIExpc3Q8QXNzb2NpYXRpb24+IGdldEFzc29jaWF0aW9ucyhib29sZWFuIHZhbGlkT25seSl7Ci0JCWlmIChtQXNzb2NpYXRpb25zID09IG51bGwpIHsKLQkJCW1Bc3NvY2lhdGlvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvbj4oKTsKLQkJCQotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhmYWxzZS8qY2hlY2tFeGlzdGluZyovKTsKLQkJfSBlbHNlIGlmIChtSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnMpIHsKLQkJCW1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9ucyA9IGZhbHNlOwotCQkJCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRydWUvKmNoZWNrRXhpc3RpbmcqLyk7Ci0JCX0KLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zOwotCQlpZiAodmFsaWRPbmx5KSB7Ci0JCQlpZiAobVZhbGlkQXNzb2NpYXRpb25zID09IG51bGwpIHsKLQkJCQkvKmZpbHRlciBvdXQgdGhlIGludmFsaWQgYXNzb2NpYXRpb25zKi8KLQkJCQltVmFsaWRBc3NvY2lhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFzc29jaWF0aW9uPihtQXNzb2NpYXRpb25zLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBtQXNzb2NpYXRpb25zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IG1Bc3NvY2lhdGlvbnMuZ2V0KGkpOwotCQkJCQlpZiAoYXNzb2NpYXRpb24uaXNWYWxpZCgpKSB7Ci0JCQkJCQltVmFsaWRBc3NvY2lhdGlvbnMuYWRkKGFzc29jaWF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFzc29jaWF0aW9ucyA9IG1WYWxpZEFzc29jaWF0aW9uczsKLQkJfSBlbHNlIHsKLQkJCWFzc29jaWF0aW9ucyA9IG1Bc3NvY2lhdGlvbnM7Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uczsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnMoYm9vbGVhbiBjaGVja0V4aXN0aW5nKSB7Ci0JCUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gZ2V0VGFibGVOYW1lcygpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHRhYmxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJT1JNR2VuVGFibGUgdGFibGUgPSBnZXRUYWJsZShpdGVyLm5leHQoKSk7Ci0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRhYmxlLCBjaGVja0V4aXN0aW5nKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhPUk1HZW5UYWJsZSB0YWJsZSwgYm9vbGVhbiBjaGVja0V4aXN0aW5nKSB7Ci0JCWlmKHRhYmxlPT1udWxsKQotCQkJcmV0dXJuOwotCQkKLQkJCi0JCUxpc3Q8Rm9yZWlnbktleUluZm8+IGZLZXlzID0gbnVsbDsKLQkJCi0JCXRyeXsKLQkJCWZLZXlzID0gRFRQVXRpbC5nZXRGb3JlaWduS2V5cyh0YWJsZS5nZXREYlRhYmxlKCkpOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGlzZSl7Ci0JCQkvL3dvcmthcm91bmQgRGFsaSBidWcgZm9yIG5vdwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiggZktleXMuc2l6ZSgpPT0wICkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8QXNzb2NpYXRpb24+IGFkZGVkQXNzb2NpYXRpb25zID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8QXNzb2NpYXRpb24+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleUluZm8+IGl0ZXIgPSBmS2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlGb3JlaWduS2V5SW5mbyBma2kgPSBpdGVyLm5leHQoKTsKLQkJCU9STUdlblRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGdldFRhYmxlKGZraS5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpOwotCQkJaWYgKHJlZmVyZW5jZWRUYWJsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IG5ldyBBc3NvY2lhdGlvbih0aGlzLCB0YWJsZS5nZXROYW1lKCksIGZraS5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkKLQkJCQkJCSwgcmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKSwgZmtpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpKTsKLQkJCWFzc29jaWF0aW9uLmNvbXB1dGVDYXJkaW5hbGl0eSgpOwotCQkJLy9EZWZlciB0aGUgY2hlY2sgb2Ygc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzIGFmdGVyIGNvbXB1dGVNYW55VG9NYW55KCkKLQkJCS8vb3RoZXJ3aXNlIHRoZSBNVE0gYXNzb2NpYXRpb24gd2lsbCBub3QgY29tcHV0ZWQgY29ycmVjdGx5IGluIHNvbWUgY2FzZXMuCi0JCQkvL2lmIChjaGVja0V4aXN0aW5nICYmIHNpbWlsYXJBc3NvY2lhdGlvbkV4aXN0cyhhc3NvY2lhdGlvbikpIHsKLQkJCS8vCWNvbnRpbnVlOwotCQkJLy99Ci0JCQlhZGRlZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQl9Ci0JCQotCQlBc3NvY2lhdGlvbiBtMm0gPSBjb21wdXRlTWFueVRvTWFueSh0YWJsZSwgYWRkZWRBc3NvY2lhdGlvbnMpOwotCQlpZiAobTJtICE9IG51bGwpIHsKLQkJCS8qZG8gbm90IGdlbmVyYXRlIHRoZSAyIG1hbnktdG8tb25lKi8KLQkJCWFkZGVkQXNzb2NpYXRpb25zLmNsZWFyKCk7Ci0JCQlhZGRlZEFzc29jaWF0aW9ucy5hZGQoMCwgbTJtKTsKLQkJfQotCQkvL3JlbW92ZSB0aGUgYXNzb2NpYXRpb24gaWYgYWxyZWFkeSBleGlzdGluZwotCQlJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXQgPSAgYWRkZWRBc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgCi0JCXdoaWxlKCBpdC5oYXNOZXh0KCkgKXsKLQkJCUFzc29jaWF0aW9uIG5ld0Fzc29jaWF0aW9uID0gaXQubmV4dCgpOwotCQkJZm9yKCBBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA6IG1Bc3NvY2lhdGlvbnMgKXsKLQkJCQlpZiggbmV3QXNzb2NpYXRpb24uZXF1YWxzKCBhc3NvY2lhdGlvbiApKXsKLQkJCQkJaXQucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQltQXNzb2NpYXRpb25zLmFkZEFsbChhZGRlZEFzc29jaWF0aW9ucyk7Ci0JfQotCXByaXZhdGUgQXNzb2NpYXRpb24gY29tcHV0ZU1hbnlUb01hbnkoT1JNR2VuVGFibGUgdGFibGUsIExpc3Q8QXNzb2NpYXRpb24+IGFkZGVkQXNzb2NpYXRpb25zKSB7Ci0JCS8qKiBtYW55LXRvLW1hbnkgYXNzb2NpYXRpb25zIGlmOgotCQkgKiAtIGFkZGVkQXNzb2NpYXRpb25zIGNvbnRhaW5zIDIgbWFueS10by1vbmUgYXNzb2NpYXRpb25zCi0JCSAqIC0gdGFibGVzIHQxIGFuZCB0MiBkb2VzIE5PVCBoYXZlIHRvIGJlIGRpZmZlcmVudCggZm9yIHNlbGYtTVRNLXNlbGYgc2l0dWF0aW9uKQotCQkgKiAtIDxjb2RlPnRhYmxlPC9jb2RlPiBjb250YWlucyBvbmx5IHRoZSBmb3JlaWduIGtleSBjb2x1bW5zLgotCQkgKiAKLQkJICogTm90ZTogZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZDoKLQkJICogLXRhYmxlIGhhcyBvbmx5IHR3byBjb2x1bW5zCi0JCSAqIC10MSBhbmQgdDIgbXVzdCBiZSBkaWZmZXJlbnQKLQkJICogLXRoZSBwcmltYXJ5IGtleSBvZiA8Y29kZT50YWJsZTwvY29kZT4gaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgaXRzIGZvcmVpZ24gCi0JCSAqIAlrZXlzIHRvIHQxIGFuZCB0Mi4qLwotCQkKLQkJaWYgKGFkZGVkQXNzb2NpYXRpb25zLnNpemUoKSAhPSAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy9NVE0gdGFibGUgc2hvdWxkIGhhdmUgdHdvIE1UTyByZWxhdGlvbnMgdG8gb3JnaW5hbCB0YWJsZXMKLQkJQXNzb2NpYXRpb24gYXNzb2MxID0gYWRkZWRBc3NvY2lhdGlvbnMuZ2V0KDApOwotCQlBc3NvY2lhdGlvbiBhc3NvYzIgPSBhZGRlZEFzc29jaWF0aW9ucy5nZXQoMSk7Ci0JCWlmIChhc3NvYzEuZ2V0Q2FyZGluYWxpdHkoKSAhPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORQotCQkJCXx8IGFzc29jMi5nZXRDYXJkaW5hbGl0eSgpICE9IEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vTVRNIHRhYmxlIHNob3VsZCBvbmx5IGluY2x1ZGUgZm9yZWlnbiBrZXkgY29sdW1ucwotCQlmb3IoIE9STUdlbkNvbHVtbiBjb2wgOiB0YWJsZS5nZXRDb2x1bW5zKCkpewotCQkJaWYoICFjb2wuaXNGb3JlaWduS2V5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0KLQkJT1JNR2VuVGFibGUgdDEgPSBhc3NvYzEuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCU9STUdlblRhYmxlIHQyID0gYXNzb2MyLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCi0JCWlmKCB0MS5nZXROYW1lKCkuZXF1YWxzKHRhYmxlLmdldE5hbWUoKSkgfHwgdDIuZ2V0TmFtZSgpLmVxdWFscyh0YWJsZS5nZXROYW1lKCkpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL01ha2UgYSBndWVzcyB3aGljaCB0YWJsZSBpcyB0aGUgb3duaW5nIHNpZGUgb2YgdGhlIE1UTSByZWxhdGlvbgotCQkvL1NlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4NDQ1Ci0JCS8vTG9naWMgYm9ycm93ZWQgZnJvbSBEVFBUYWJsZVdyYXBwZXIuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpCi0JCWlmKCAhdGFibGUuZ2V0TmFtZSgpLmVxdWFscyh0MS5nZXROYW1lKCkgKyAiXyIgKyB0Mi5nZXROYW1lKCkgKSApIHsKLQkJCS8vc3dhcCB0MSBhbmQgdDIgIAotCQkJT1JNR2VuVGFibGUgdDMgPSB0MTsKLQkJCXQxPXQyOwotCQkJdDI9dDM7Ci0JCQkvL3N3YXAgYXNzb2MxIGFuZCBhc3NvYzIKLQkJCUFzc29jaWF0aW9uIGFzc29jMz1hc3NvYzE7Ci0JCQlhc3NvYzE9YXNzb2MyOwotCQkJYXNzb2MyPWFzc29jMzsKLQkJfQotCQkKLS8vQ29tbWVudGVkIG91dCBiZWNhdXNlIHRoZSBhc3N1bXB0aW9uIGlzIHRvbyByZXN0cmljdGl2ZTogCi0vL3RoaXMgY2hlY2sgd2lsbCBwcmV2ZW50IGdlbmVyYXRpbmcgTVRNIG1hcHBpbmcgdGFibGUgbm90IGhhdmluZyAKLS8vcHJpbWFyeSBrZXkgZGVmaW5lZCAJCQotLy8JCUxpc3QgcGtOYW1lcyA9IERUUFV0aWwuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWVzKHRhYmxlLmdldERiVGFibGUoKSk7Ci0vLwkJaWYgKHBrTmFtZXMuc2l6ZSgpICE9IHRhYmxlLmdldENvbHVtbk5hbWVzKCkuc2l6ZSgpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlMaXN0IGZrTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdChhc3NvYzEuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKTsgLy9jbG9uZSBiZWNhdXNlIHdlIG1vZGlmeSBieSBhZGRBbGwgYmVsb3cKLS8vCQlma05hbWVzLmFkZEFsbChhc3NvYzIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKTsKLS8vCQlpZiAoIUNvbGxlY3Rpb25VdGlsLmVxdWFsc0lnbm9yZU9yZGVyKHBrTmFtZXMsIGZrTmFtZXMpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLQkJQXNzb2NpYXRpb24gbTJtID0gbmV3IEFzc29jaWF0aW9uKHRoaXMsIHQxLmdldE5hbWUoKS8qcmVmZXJyZXJUYWJsZU5hbWUqLywgYXNzb2MxLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLypyZWZlcnJlckNvbE5hbWVzKi8KLQkJCQksIHQyLmdldE5hbWUoKS8qcmVmZXJlbmNlZFRhYmxlTmFtZSovLCBhc3NvYzIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkvKnJlZmVyZW5jZWRDb2xOYW1lcyovCi0JCQkJLCB0YWJsZS5nZXROYW1lKCksIGFzc29jMS5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkvKnJlZmVycmVySm9pbkNvbE5hbWVzKi8sIGFzc29jMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkvKnJlZmVyZW5jZWRKb2luQ29sTmFtZXMqLyk7Ci0JCW0ybS5zZXRDdXN0b20oZmFsc2UpOwotCQlyZXR1cm4gbTJtOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIEZpbGVIZWFkZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSBoZWFkZXIgb2YgdGhlIGN1c3RvbWl6YXRpb24gZmlsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlSGVhZGVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkvKioKLQkJICogU2hvdWxkIGJlIGFyZ3VtZW50LWxlc3MgYmVjYXVzZSBpdCBpcyB1c2VkIGluIAotCQkgKiB0aGUgZGUtc2VyaWFsaXphdGlvbiBwcm9jZXNzLgotCQkgKi8KLQkJcHVibGljIEZpbGVIZWFkZXIoKSB7Ci0JCQltVmVyc2lvbiA9IEZJTEVfVkVSU0lPTjsKLQkJfQotCQlpbnQgbVZlcnNpb247Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzb3J0QXNzb2NpYXRpb25zKCBMaXN0PCBBc3NvY2lhdGlvbiA+IGxpc3QgKSB7Ci0JICAgQ29sbGVjdGlvbnMuc29ydCggbGlzdCwgbmV3IENvbXBhcmF0b3I8IEFzc29jaWF0aW9uID4oKSB7Ci0JICAgICAgcHVibGljIGludCBjb21wYXJlKCBBc3NvY2lhdGlvbiBsaHMsIEFzc29jaWF0aW9uIHJocyApIHsKLQkgICAgICAgICAvLyBzb3J0IGJ5IHJlZmVycmVyIHRhYmxlIG5hbWUgZmlyc3QuLi4KLQkgICAgICAgICBpbnQgdGVzdCA9IGxocy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmNvbXBhcmVUbyggcmhzLmdldFJlZmVycmVyVGFibGVOYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKCB0ZXN0ICE9IDAgKQotICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICAvLyB0aGVuIGJ5IHJlZmVyZW5jZWQgdGFibGUgbmFtZS4uLgotICAgICAgICAgICAgdGVzdCA9IGxocy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkuY29tcGFyZVRvKCByaHMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpICk7Ci0gICAgICAgICAgICBpZiggdGVzdCAhPSAwICkKLSAgICAgICAgICAgICAgIHJldHVybiB0ZXN0OwotICAgICAgICAgICAgLy8gaWYgcmVmZXJyZXIgYW5kIHJlZmVyZW5jZWQgdGFibGVzIGFyZSB0aGUgc2FtZSwgdGhleSBzaG91bGQKLSAgICAgICAgICAgIC8vIGFwcGVhciBuZXh0IHRvIGVhY2ggb3RoZXIKLSAgICAgICAgICAgIHJldHVybiAwOwotCSAgICAgIH0KLQkgICB9ICk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gbVVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHVwZGF0ZVBlcnNpc3RlbmNlWG1sKSB7Ci0JCXRoaXMubVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdXBkYXRlUGVyc2lzdGVuY2VYbWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI0ZTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRW50aXR5R2VuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgT1JNIGdlbmVyYXRpb24gcHJvcGVydGllcyBmb3IgYSBkYXRhYmFzZSB0YWJsZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNyZWF0ZWQvY2hhbmdlZCBieSB0aGUgZ2VuZXJhdGlvbiB3aXphcmQsIGFuZAotICogZ2VuZXJhdGVkIHVzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcy4gVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlCi0gKiBwZXJzaXN0ZWQvcmV0cmlldmVkIHVzaW5nIDxjb2RlPk9STUdlbkN1c3RvbWl6ZXI8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPUk1HZW5UYWJsZQotewotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIExpc3Q8T1JNR2VuQ29sdW1uPiBtQ29sdW1uczsKLQlwcml2YXRlIFRhYmxlIG1EYlRhYmxlOwotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY29sdW1uVHlwZXNNYXAgPSAgbnVsbDsKLQkvKioKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIFRoZSBkYXRhYmFzZSB0YWJsZSBvciBudWxsIGlmIHRoaXMgdGFibGUgaXMgdXNlZCB0byBnZXQvc2V0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0aWVzIChwcm9wZXJ0aWVzIHRoYXQgYXBwbHkgdG8gYWxsCi0JICogICAgICAgICAgICB0YWJsZXMgdW5sZXNzIG92ZXJyaWRlbikuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlKFRhYmxlIHRhYmxlLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoKTsKLQkJbURiVGFibGUgPSB0YWJsZTsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCX0KLQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBtQ3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0YWJsZSBpcyBpcyB1c2VkIHRvIGdldC9zZXQgdGhlIGRlZmF1bHQgdGFibGUKLQkgKiBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdHNUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5KHByb3BOYW1lLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgZ2V0TmFtZSgpLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSB2YWx1ZSkgewotCQkJc2V0Q3VzdG9taXplZChwcm9wTmFtZSwgbnVsbCk7IC8vIHJlbW92ZSB0aGUgcHJvcGVydHkKLQkJfQotCQllbHNlIHsKLQkJCWdldEN1c3RvbWl6ZXIoKS5zZXRCb29sZWFuUHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiBtRGJUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCXJldHVybiBtRGJUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYlRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmluZyB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCWlmIChEVFBVdGlsLmlzRGVmYXVsdFNjaGVtYShtRGJUYWJsZSkgfHwgbURiVGFibGUuZ2V0U2NoZW1hKCk9PW51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBtRGJUYWJsZS5nZXRTY2hlbWEoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBzY2hlbWFOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUZvbGRlcihTdHJpbmcgc3JjRm9sZGVyKXsKLQkJc2V0Q3VzdG9taXplZChTUkNfRk9MREVSLCBzcmNGb2xkZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZvbGRlcigpewotCQlTdHJpbmcgc3JjRm9sZGVyID0gY3VzdG9taXplZChTUkNfRk9MREVSKTsKLQkJcmV0dXJuIHNyY0ZvbGRlciA9PSBudWxsID8gIiIgOiBzcmNGb2xkZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0U3RhdGVtZW50cygpewotCQlidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBwYWNrYWdlcyA9IGNvbHVtblR5cGVzTWFwLmtleVNldCgpOwotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoIFN0cmluZyBzIDogcGFja2FnZXMgKSB7Ci0JCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBzICsgIjtcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IGdldEFzc29jaWF0aW9uUm9sZXMoKTsKLQkJZm9yICggQXNzb2NpYXRpb25Sb2xlIHJvbGUgOiAgYXNzb2NpYXRpb25Sb2xlcyApIHsKLQkJCWlmICggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uT05FX1RPX01BTlkgKQotCQkJCQl8fCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkgKSApIHsKLQkJCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBnZXREZWZhdWx0Q29sbGVjdGlvblR5cGUoKSArICI7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBpbXBvcnQgc3RhdGVtZW50cyBmb3IgdHlwZXMgZnJvbSBqYXZheC5wZXJzaXN0ZW5jZSBwYWNrYWdlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEphdmF4UGVyc2lzdGVuY2VJbXBvcnRTdGF0ZW1lbnRzKCkgewotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5O1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIEBDb2x1bW5zIGlzIG5lZWRlZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjtcbiIpOy8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIHRoZXJlIGlzIEBJZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkO1xuIik7Ly8kTk9OLU5MUy0xJAotCQlpZiggIXRoaXMuaXNEZWZhdWx0bmFtZSgpICkKLQkJCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7XG4iKTsvLyROT04tTkxTLTEkCi0JCWlmKCB0aGlzLmlzQ29tcG9zaXRlS2V5KCkgKQotCQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXBwZW5kIGphdmF4LnBlcnNpc3RlbmNlIHBhY2thZ2UgaW1wb3J0cwotCQlIYXNoU2V0PFN0cmluZz4ganBhSW1wb3J0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IoIEFzc29jaWF0aW9uUm9sZSByb2xlIDogIGFzc29jaWF0aW9uUm9sZXMgKXsKLQkJCWlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FICkgKXsKLQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsiICk7Ly8kTk9OLU5MUy0xJAotCQkJfWVsc2V7Ci0JCQkJaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZICkgKXsKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55O1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQl9ZWxzZSBpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uO1xuIiApOyAvLyROT04tTkxTLTEkCi0JCQkJfWVsc2UgaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSApICl7Ci0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1ucztcbiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciggU3RyaW5nIHM6IGpwYUltcG9ydHMpewotCQkJcmV0LmFwcGVuZChzKTsKLQkJfQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkQ29sdW1uVHlwZXNNYXAoKXsKLQkJaWYgKCBjb2x1bW5UeXBlc01hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29sdW1uVHlwZXNNYXA7Ci0JCX0KLQkJY29sdW1uVHlwZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yICggT1JNR2VuQ29sdW1uIGNvbCA6IHRoaXMuZ2V0Q29sdW1ucygpICkgewotCQkJU3RyaW5nIHR5cGUgPSBjb2wuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQlpZiAoICFjb2wuaXNQYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5KCkKLQkJCQkJJiYgIWNvbC5pc0ZvcmVpZ25LZXkoKQotCQkJCQkmJiAhdHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSAmJiB0eXBlLmluZGV4T2YoJy4nKT4wICkgewotCQkJCVN0cmluZyBzaW1wbGVUeXBlPSB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpKzEgKTsKLQkJCQljb2x1bW5UeXBlc01hcC5wdXQodHlwZSwgc2ltcGxlVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtblR5cGVzTWFwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsaWZpZWRDb2xUeXBlKFN0cmluZyBmcXRuICkgewotCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG1hcC5nZXQoZnF0bik7Ci0JCWlmICggIHR5cGVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdHlwZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZxdG47Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2UgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQKLQkgKiBwYWNrYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBrZykgewotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkoUEFDS0FHRSwgcGtnLCBnZXROYW1lKCksIG51bGwpOyAKLQkJLy8gbm90IGNhbGxpbmcgc2V0Q3VzdG9taXplZCBzbyB0aGF0IGVtcHR5IHN0cmluZ3MgZG8gbm90IGdldCBudWxsZWQgb3V0LgotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgcGFja2FnZSAoZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGN1c3RvbWl6ZWQoUEFDS0FHRSk7Ci0JCXJldHVybiBwYWNrYWdlTmFtZSA9PSBudWxsID8gIiIgOiBwYWNrYWdlTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBKYXZhIGNsYXNzIG5hbWUgKG5vdCBxdWFsaWZpZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vIG5hbWUgPSBTdHJpbmdVdGlsLnRhYmxlTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJLy8gbmFtZSA9IFN0cmluZ1V0aWwuaW5pdFVwcGVyKG5hbWUpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShnZXROYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCS8qCi0JCSAqIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSAocG9zc2libHkgY29tcHV0ZWQpIGNsYXNzIG5hbWUKLQkJICogdGhlbiBub3RoaW5nIHRvIGRvCi0JCSAqLwotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGNsYXNzTmFtZSwgZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKENMQVNTX05BTUUsIGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmFtZSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGEgdmFyaWFibGUgb3IgY2xhc3MgbmFtZS4gVGhpcyBpcwotCSAqIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzaW5ndWxhcgotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgbmFtZSBzaG91bGQgYmUgc2luZ3VsYXIgb3IgcGx1cmFsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyTmFtZShib29sZWFuIHNpbmd1bGFyKSB7Ci0JCVN0cmluZyBuYW1lID0gU3RyaW5nVXRpbC50YWJsZU5hbWVUb1Zhck5hbWUoZ2V0TmFtZSgpKTsKLQkJaWYgKHNpbmd1bGFyKSB7Ci0JCQluYW1lID0gU3RyaW5nVXRpbC5zaW5ndWxhcmlzZShuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnBsdXJhbGlzZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgZ2VuZXJhdGVkIEphdmEgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHF1YWxpZnkoZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvc2l0ZSBrZXkgSmF2YSBjbGFzcyBuYW1lIChub3QgcXVhbGlmaWVkKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBnZXRDbGFzc05hbWUoKSArICJQSyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY29tcG9zaXRlIGtleSBKYXZhIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBxdWFsaWZ5KGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb3NpdGUga2V5IHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiAiaWQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhpcwotCSAqIHRhYmxlLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJaWYgKG1Db2x1bW5zID09IG51bGwpIHsKLQkJCW1Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCQlmb3IgKENvbHVtbiBjIDogbURiVGFibGUuZ2V0Q29sdW1ucygpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGdlbkNvbHVtbiA9IGdldEN1c3RvbWl6ZXIoKS5jcmVhdGVHZW5Db2x1bW4oYyk7Ci0JCQkJZ2VuQ29sdW1uLnNldEdlblRhYmxlKHRoaXMpOwotCQkJCW1Db2x1bW5zLmFkZChnZW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtQ29sdW1uczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoQ29sdW1uIGMgOiBtRGJUYWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCXJldC5hZGQoYy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdGFibGUncwotCSAqIHByaW1hcnkga2V5LgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXQgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJZm9yIChDb2x1bW4gY29sdW1uIDogbURiVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSkgewotCQkJcmV0LmFkZChuZXcgT1JNR2VuQ29sdW1uKGNvbHVtbiwgdGhpcy5tQ3VzdG9taXplcikpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gb3IgbWFueSBwcmltYXJ5IGtleQotCSAqIGNvbHVtbnMuCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRQcmltYXJ5S2V5Q29sdW1uKCkgewotCQlPUk1HZW5Db2x1bW4gcGtDb2wgPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcGtDb2x1bW5zID0gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQkJaWYgKHBrQ29sdW1ucy5zaXplKCkgPT0gMSkgewotCQkJLy8gQ29sdW1uIGRiQ29sID0gKENvbHVtbilwa0NvbHVtbnMuZ2V0KDApOwotCQkJcGtDb2wgPSBwa0NvbHVtbnMuZ2V0KDApOyAvLyAoT1JNR2VuQ29sdW1uKQotCQkJCQkJCQkJCS8vIG1DdXN0b21pemVyLmNyZWF0ZUdlbkNvbHVtbihkYkNvbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogaWYgbm8gcGsgY29sdW1uIHRoZW4gbG9vayBmb3IgdGhlIGZpcnN0IGNvbHVtbiB3aXRoIGlkIG1hcHBpbmcKLQkJCSAqIGtpbmQuIFRoaXMgaXMgc28gdGhhdCB0aGUgd2l6YXJkIGNhbiBiZSB1c2VkIHdpdGggdGFibGVzIG5vdAotCQkJICogaGF2aW5nIHByaW1hcnkga2V5cy4KLQkJCSAqLwotCQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2x1bW4uZ2V0TWFwcGluZ0tpbmQoKS5lcXVhbHMobUN1c3RvbWl6ZXIuZ2V0SWRNYXBwaW5nS2luZCgpKSkgewotCQkJCQlwa0NvbCA9IGNvbHVtbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwa0NvbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgcGsgY29sdW1uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcG9zaXRlS2V5KCkgewotCQlyZXR1cm4gbURiVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPiAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHRoZSBjb2x1bW5zIHRoYXQKLQkgKiBhcmUgbm90IHBhcnQgb2YgYW55IGFzc29jaWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBnZW5Pbmx5Ci0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgb25seSB0aGUgY29sdW1ucyBtYXJrZWQgZm9yIGdlbmVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVQawotCSAqICAgICAgICAgICAgV2hldGhlciB0byBpbmNsdWRlIHRoZSBwcmltYXJ5IGtsZXkgY29sdW1uKHMpLgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlSW5oZXJpdGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGNvbHVtbnMgYXNzb2NpYXRlZCB3aXRoIEphdmEgcHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhhdCBleGlzdCBpbiB0aGUgc3VwZXIgY2xhc3MgKGlmIGFueSkuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRTaW1wbGVDb2x1bW5zKGJvb2xlYW4gZ2VuT25seSwgYm9vbGVhbiBpbmNsdWRlUGssIGJvb2xlYW4gaW5jbHVkZUluaGVyaXRlZCkgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IHJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoZ2VuT25seSAmJiAhY29sdW1uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KCkpIHsKLQkJCQlpZiAoIWluY2x1ZGVQayB8fCBpc0NvbXBvc2l0ZUtleSgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQoMCwgY29sdW1uKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaXNDb2x1bW5JbkFzc2NvY2lhdGlvbihjb2x1bW4sIHJvbGVzKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVzdWx0LmFkZChjb2x1bW4pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRTaW1wbGVDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLyogZ2VuT25seSAqLywgdHJ1ZS8qIGluY2x1ZGVQayAqLywgdHJ1ZS8qIGluY2x1ZGVJbmhlcml0ZWQgKi8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIGNvbHVtbiBzaG91bGQgYmUgZ2VuZXJhdGVkIHdpdGggZmFsc2UKLQkgKiB1cGRhdGFibGUvaW5zZXJ0YWJsZS4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSBjb2x1bW4gaXMgbWFwcGVkIG1vcmUKLQkgKiB0aGFuIG9uY2UsIHRoaXMgdXN1YWxseSBoYXBwZW4gd2l0aCBjb2x1bW5zIGluIGNvbXBvc2l0ZSBrZXlzIGFuZAotCSAqIG1hbnktdG8tb25lIGFzc29jaWF0aW9ucy4KLQkgKiAKLQkgKiA8YnI+Ci0JICogTm90ZSB0aGF0IGZvciBIaWJlcm5hdGUgdGhlIGNvbHVtbiBwYXJhbSBpcyBudWxsIGJlY2F1c2UgdGhlCi0JICogaW5zZXJ0L3VwZGF0ZSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBtYW55LXRvLW9uZSB0YWcgaXRzZWxmCi0JICogaW5zdGVhZCBvZiB0aGUgbmVzdGVkIGNvbHVtbiB0YWdzIChib2d1cyBvYnZpb3VzbHkpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29sdW1uVXBkYXRlSW5zZXJ0KEFzc29jaWF0aW9uUm9sZSByb2xlLCBPUk1HZW5Db2x1bW4gY29sdW1uKSB7Ci0JCWlmIChjb2x1bW4gPT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSByb2xlLmdldFJlZmVycmVyQ29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9STUdlbkNvbHVtbiBjID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFpc0NvbHVtblVwZGF0ZUluc2VydChyb2xlLCBjKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIHNob3VsZCBsb29rIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgdXNpbmcgdGhlIHNhbWUgY29sdW1uCi0JCSAqIGFuZCByZXR1cm4gZmFsc2UsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGFuIHVudXN1YWwgY2FzZS4KLQkJICovCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotCSAqIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldENvbHVtbnNCeU5hbWVzKExpc3Q8U3RyaW5nPiBuYW1lcykgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW5CeU5hbWUobmFtZSk7Ci0JCQlhc3NlcnQgKGNvbHVtbiAhPSBudWxsKTsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQoY29sdW1uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbnMgaGF2aW5nIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRDb2x1bW5CeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QXNzb2NpYXRpb25Sb2xlPC9jb2RlPiBvYmplY3RzIGZvciB0aGlzIHRhYmxlLiBPbmx5IHRoZQotCSAqIGFzc29jaWF0aW9uIG1hcmtlZCBmb3IgZ2VuZXJhdGlvbiBhcmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIExpc3Q8QXNzb2NpYXRpb25Sb2xlPiBnZXRBc3NvY2lhdGlvblJvbGVzKCkgewotCQkvKgotCQkgKiB0aGlzIGlzIG5vdCBjYWNoZWQgaW50ZW50aW9uYWxseSBiZWNhdXNlIGludmFsaWRhdGluZyB0aGUgY2FjaGUgd2l0aAotCQkgKiB3aXphcmQgY2hhbmdlcyBpcyBraW5kYSB0cmlja3kuCi0JCSAqLwotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IG5ldyBBcnJheUxpc3Q8QXNzb2NpYXRpb25Sb2xlPigpOwotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gbUN1c3RvbWl6ZXIuZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ZXIgPSBhc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhc3NvY2lhdGlvbi5pc0dlbmVyYXRlZCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvKgotCQkJICogY2hlY2sgYm90aCByZWZlcnJlcmFuZCByZWZlcmVuY2VkIGJlY2F1c2UgYW4gYXNzb2NpYXRpb24gY291bGQgYmUKLQkJCSAqIGZyb20tdG8gdGhlIHNhbWUgdGFibGUgKGVtcGxveWVlL21hbmFnZXIpCi0JCQkgKi8KLQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQlhc3NvY2lhdGlvblJvbGVzLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCWFzc29jaWF0aW9uUm9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25Sb2xlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKENMQVNTX0RFU0MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBjbGFzcyBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXwKLQkgKiB7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0gfHtAbGluayAjUFJJVkFURV9TQ09QRX0uIFRoaXMgbWV0aG9kIG5ldmVyCi0JICogcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChDTEFTU19TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbmRzKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChFWFRFTkRTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRzKFN0cmluZyBiYXNlQ2xhc3MpIHsKLQkJc2V0Q3VzdG9taXplZChFWFRFTkRTLCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW1wbGVtZW50cygpIHsKLQkJU3RyaW5nIHN0ciA9IGN1c3RvbWl6ZWQoSU1QTEVNRU5UUyk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBTdHJpbmdVdGlsLnN0clRvTGlzdChzdHIsICcsJywgdHJ1ZS8qIHRyaW0gKi8pOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50cyhMaXN0PFN0cmluZz4gaW50ZXJmYWNlcykgewotCQlzZXRDdXN0b21pemVkKElNUExFTUVOVFMsIFN0cmluZ1V0aWwubGlzdFRvU3RyKGludGVyZmFjZXMsICcsJykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gdGhlIEphdmEgY2xhc3MgZm9yIGV4dGVuZHMKLQkgKiBhbmQgaW1wbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRXh0ZW5kc0ltcGxlbWVudHMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBleHRlbmRzQ2xhc3MgPSBnZXRFeHRlbmRzKCk7Ci0JCWlmIChleHRlbmRzQ2xhc3MgIT0gbnVsbCAmJiAhZXh0ZW5kc0NsYXNzLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpICYmICFleHRlbmRzQ2xhc3MuZXF1YWxzKCJPYmplY3QiKSkgewotCQkJYnVmZmVyLmFwcGVuZCgiZXh0ZW5kcyAiICsgc2ltcGxpZnlDbGFzc05hbWUoZXh0ZW5kc0NsYXNzKSArICIgIik7IC8vZml4IGZvciBidWcgMjc4NjI2Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiaW1wbGVtZW50cyBTZXJpYWxpemFibGUiKTsgLy8gYXNzdW1pbmcgdGhhdCB0aGUgSmF2YQotCQkJCQkJCQkJCQkJCS8vIGZpbGUgdGVtcGxhdGUgaW1wb3J0cyB0aGUKLQkJCQkJCQkJCQkJCQkvLyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGdldEltcGxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiwgIiArIHNpbXBsaWZ5Q2xhc3NOYW1lKGl0ZXIubmV4dCgpKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHNpbXBsaWZ5Q2xhc3NOYW1lKFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0JCWZpbmFsIFN0cmluZyBKQVZBX0xBTkcgPSAiamF2YS5sYW5nLiI7Ci0JCWlmIChmdWxsQ2xhc3NOYW1lLnN0YXJ0c1dpdGgoSkFWQV9MQU5HKSkgewotCQkJcmV0dXJuIGZ1bGxDbGFzc05hbWUuc3Vic3RyaW5nKEpBVkFfTEFORy5sZW5ndGgoKSk7Ci0JCX0KLQkJU3RyaW5nIHBrZyA9IFN0cmluZ1V0aWwuZ2V0UGFja2FnZU5hbWUoZnVsbENsYXNzTmFtZSk7Ci0JCWlmIChwa2cgIT0gbnVsbCAmJiBTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhwa2csIGdldFBhY2thZ2UoKSkpIHsKLQkJCXJldHVybiBTdHJpbmdVdGlsLmdldENsYXNzTmFtZShmdWxsQ2xhc3NOYW1lKTsKLQkJfQotCQlyZXR1cm4gZnVsbENsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBnZW5lcmF0b3Igc2NoZW1lIChhc3NpZ25lZCwgc2VxdWVuY2UsIGV0YykuIERvZXMgbm90Ci0JICogcmV0dXJuIG51bGwsIGRlZmF1bHRzIHRvICJhc3NpZ25lZCIgb3IgImlkZW50aXR5IiBkZXBlbmRpbmcgb24gd2hldGhlcgotCSAqIHRoZSB0YWJsZSBoYXMgYW4gaWRlbnRpdHkgY29sdW1uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRHZW5lcmF0b3IoKSB7Ci0JCVN0cmluZyBnZW5lcmF0b3IgPSBjdXN0b21pemVkKElEX0dFTkVSQVRPUik7Ci0JCVN0cmluZyBub25lR2VuZXJhdG9yID0gZ2V0Q3VzdG9taXplcigpLmdldE5vSWRHZW5lcmF0b3IoKTsKLQkJaWYgKCFpc0RlZmF1bHRzVGFibGUoKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgZG9uZSBtYWlubHkgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBjYXNlcyB3aGVyZSBzb21lCi0JCQkgKiB0YWJsZXMgaGF2ZSBhdXRvaW5jdGVtZW50IHBrIGFuZCBvdGhlcnMgYXJlIGFzc2lnbmVkLiBJbiB0aGlzCi0JCQkgKiBjYXNlIHRoaXMgbWFrZXMgaXQgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgIm5vbmUiCi0JCQkgKiBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgaW50ZXJwcmV0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXNlLgotCQkJICovCi0JCQlpZiAoZ2VuZXJhdG9yID09IG51bGwgfHwgZ2VuZXJhdG9yLmVxdWFscyhub25lR2VuZXJhdG9yKSkgewotCQkJCU9STUdlbkNvbHVtbiBwa0NvbHVtbiA9IGdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJCQlpZiAocGtDb2x1bW4gIT0gbnVsbCAmJiBEVFBVdGlsLmlzQXV0b0luY3JlbWVudChwa0NvbHVtbi5nZXREYkNvbHVtbigpKSkgewotCQkJCQlnZW5lcmF0b3IgPSBnZXRDdXN0b21pemVyKCkuZ2V0SWRlbnRpdHlJZEdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWdlbmVyYXRvciA9IG5vbmVHZW5lcmF0b3I7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBpZCBnZW5lcmF0b3Igc2NoZW1lIChhc3NpZ25lZCwgc2VxdWVuY2UsIGV0YykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRHZW5lcmF0b3IoU3RyaW5nIHNjaGVtZSkgewotCQlzZXRDdXN0b21pemVkKElEX0dFTkVSQVRPUiwgc2NoZW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBuYW1lIGZvciB0aGUgZ2l2ZW4gdGFibGUsIG9yIG51bGwgaWYgbm9uZSAobWFrZXMKLQkgKiBzZW5zZSBvbmx5IHdoZW4gdGhlIHNjaGVtZSBpcyBuYXRpdmUsIHNlcXVlbmNlLCAuLikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoU0VRVUVOQ0UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCXNldEN1c3RvbWl6ZWQoU0VRVUVOQ0UsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcXVlbmNlIG5hbWUgYWZ0ZXIgcmVwbGFjaW5nIHRoZSAke3RhYmxlfSBhbmQgJHtwa30gYnkgdGhlaXIKLQkgKiB2YWx1ZXMsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFNlcXVlbmNlKCkgewotCQlTdHJpbmcgc2VxdWVuY2UgPSBnZXRTZXF1ZW5jZSgpOwotCQlpZiAoc2VxdWVuY2UgIT0gbnVsbCkgewotCQkJLyogcmVzb2x2ZSB0aGUgJHt0YWJsZX0gYW5kICR7cGt9IHBhdHRlcm5zICovCi0JCQlzZXF1ZW5jZSA9IFN0cmluZ1V0aWwuc3RyUmVwbGFjZShzZXF1ZW5jZSwgVEFCTEVfU0VRX1BBVFRFUk4sIGdldE5hbWUoKSk7Ci0JCQlpZiAoc2VxdWVuY2UuaW5kZXhPZihQS19TRVFfUEFUVEVSTikgPj0gMCkgewotCQkJCUl0ZXJhdG9yPENvbHVtbj4gcGtDb2xzID0gZ2V0RGJUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgcGtOYW1lID0gcGtDb2xzLmhhc05leHQoKSA/IHBrQ29scy5uZXh0KCkuZ2V0TmFtZSgpIDogbnVsbDsKLQkJCQlzZXF1ZW5jZSA9IFN0cmluZ1V0aWwuc3RyUmVwbGFjZShzZXF1ZW5jZSwgUEtfU0VRX1BBVFRFUk4sIHBrTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcXVlbmNlICE9IG51bGwgPyBzZXF1ZW5jZS50b1VwcGVyQ2FzZSgpIDogIiI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsZW1lbnRFcXVhbHMoKSB7Ci0JCXJldHVybiAhInRydWUiLmVxdWFscyhjdXN0b21pemVkKElNUExFTUVOVF9FUVVBTFMpKTsgLy8gZGVmYXVsdHMgdG8KLQkJCQkJCQkJCQkJCQkJCQkvLyBmYWxzZQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudEVxdWFscyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKElNUExFTUVOVF9FUVVBTFMsIHZhbHVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW55IGNvbHVtbiBwYXJ0aWNpcGF0aW5nIGluIGVxdWFscy9oYXNoY29kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb2x1bW5zSW5FcXVhbHMoKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0U2ltcGxlQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHtAbGluayAjR0VORVJBVEVfRERMX0FOTk9UQVRJT059IGluZGljYXRpbmcgd2hldGhlciB0aGUgb3B0aW9uYWwKLQkgKiBEREwgcGFyYW1ldGVycyBsaWtlIGxlbmd0aCwgbnVsbGFibGUsIHVucWl1ZSwgZXRjIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gQENvbHVtbgotCSAqIGFubm90YXRpb24uIGRlZmF1bHRzIHRvIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVERExBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoY3VzdG9taXplZChPUk1HZW5DdXN0b21pemVyLkdFTkVSQVRFX0RETF9BTk5PVEFUSU9OKSk7IC8vIGRlZmF1bHRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmFsc2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZURETEFubm90YXRpb25zKGJvb2xlYW4gZ2VuZXJhdGUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oT1JNR2VuQ3VzdG9taXplci5HRU5FUkFURV9ERExfQU5OT1RBVElPTiwgZ2VuZXJhdGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI1BST1BFUlRZX0FDQ0VTU318e0BsaW5rICNGSUVMRF9BQ0NFU1N9IGluZGljYXRpbmcKLQkgKiBob3cgdGhlIGVudGl0eSBwcm9wZXJ0aWVzIGFyZSBtYXBwZWQuIERvZXMgbm90IHJldHVybiBudWxsIChkZWZhdWx0cyB0bwotCSAqIHtAbGluayAjRklFTERfQUNDRVNTfSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3MoKSB7Ci0JCVN0cmluZyBuYW1lID0gY3VzdG9taXplZChBQ0NFU1MpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gRklFTERfQUNDRVNTOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhTdHJpbmcgYWNjZXNzKSB7Ci0JCWFzc2VydCAoYWNjZXNzID09IG51bGwgfHwgYWNjZXNzLmVxdWFscyhQUk9QRVJUWV9BQ0NFU1MpIHx8IGFjY2Vzcy5lcXVhbHMoRklFTERfQUNDRVNTKSk7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoYWNjZXNzLCBnZXRBY2Nlc3MoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoQUNDRVNTLCBhY2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgb2Yge0BsaW5rICNMQVpZX0ZFVENIfXx7QGxpbmsgI0VBR0VSX0ZFVENIfSBpbmRpY2F0aW5nIGhvdwotCSAqIHRoZSB0YWJsZSBhc3NvY2lhdGlvbnMgYXJlIGZlY2hlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBwcm92aWRlciBkZWZhdWx0cwotCSAqIHNob3VsZCBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChERUZBVUxUX0ZFVENIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmV0Y2goU3RyaW5nIGZldGNoKSB7Ci0JCWFzc2VydCAoZmV0Y2ggPT0gbnVsbCB8fCBmZXRjaC5lcXVhbHMoTEFaWV9GRVRDSCkgfHwgZmV0Y2guZXF1YWxzKEVBR0VSX0ZFVENIKSk7Ci0JCXNldEN1c3RvbWl6ZWQoREVGQVVMVF9GRVRDSCwgZmV0Y2gpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb2xsZWN0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJU0VUX0NPTExFQ1RJT05fVFlQRSwgTElTVF9DT0xMRUNUSU9OX1RZUEUKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0xJU1RfQ09MTEVDVElPTl9UWVBFfXx7QGxpbmsgI1NFVF9DT0xMRUNUSU9OX1RZUEV9Ci0JICogaW5kaWNhdGluZyB0aGUgSmF2YSB0eXBlIChmdWxsIGNsYXNzIG5hbWUpIHVzZWQgZm9yIHByb3BlcnRpZXMgb2YKLQkgKiBjb2xsZWN0aW9uIHR5cGVzLiBUaGlzIGRvZXMgbm90IHJldHVybiBudWxsIChkZWZhdWx0cyB0byBsaXN0KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpIHsKLQkJU3RyaW5nIGNUeXBlID0gY3VzdG9taXplZChERUZBVUxUX0NPTExFQ1RJT05fVFlQRSk7Ci0JCWlmIChjVHlwZSA9PSBudWxsKSB7Ci0JCQljVHlwZSA9IFNFVF9DT0xMRUNUSU9OX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIGNUeXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZUNvbGxlY3Rpb25UeXBlKCl7Ci0JCSBTdHJpbmcgdHlwZSA9IGdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpOwotCQlyZXR1cm4gdHlwZS5zdWJzdHJpbmcoIHR5cGUubGFzdEluZGV4T2YoJy4nKSArMSApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb2xsZWN0aW9uVHlwZShTdHJpbmcgY1R5cGUpIHsKLQkJYXNzZXJ0IChjVHlwZS5lcXVhbHMoTElTVF9DT0xMRUNUSU9OX1RZUEUpIHx8IGNUeXBlLmVxdWFscyhTRVRfQ09MTEVDVElPTl9UWVBFKSk7Ci0JCXNldEN1c3RvbWl6ZWQoREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUsIGNUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByaW1hcnkga2V5IGlzIGNvbXBvdW5kIGFuZCBhbnkgb2YgaXRzIGNvbHVtbnMgc2hvdWxkCi0JICogYmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcG91bmRLZXlVc2VJbkVxdWFscygpIHsKLQkJaWYgKGlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNvbHVtbi5pc1VzZUluRXF1YWxzKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGVVc2VJbkVxdWFscyhBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlmb3IgKEl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gaXRlciA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIG9mIG5hbWUgZWxlbWVudCBpbiB0aGUgQFRhYmxlIGlzIGRlZmF1bHQgc28gd2UKLQkgKiBjYW4gc2tpcCBnZW5lcmF0aW5nIHRoZSBhbm5vdGF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0bmFtZSgpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBnZXRDbGFzc05hbWUoKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShlbnRpdHlOYW1lLCBtRGJUYWJsZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIFF1YWxpZmllcyBhIGNsYXNzIG5hbWUgaWYgdGhlcmUgaXMgYSBwYWNrYWdlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHF1YWxpZnkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgcGtnID0gZ2V0UGFja2FnZSgpOwotCQlpZiAocGtnICE9IG51bGwgJiYgcGtnLmxlbmd0aCgpICE9IDApIHsKLQkJCWNsYXNzTmFtZSA9IHBrZyArICcuJyArIGNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIGlzIHBhcnQgb2YgYW55IGFzc29jaWF0aW9uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbHVtbkluQXNzY29jaWF0aW9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIExpc3Q8QXNzb2NpYXRpb25Sb2xlPiByb2xlcykgewotCQlmb3IgKGludCBpID0gMCwgbiA9IHJvbGVzLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSByb2xlcy5nZXQoaSk7Ci0JCQlMaXN0PE9STUdlbkNvbHVtbj4gY29scyA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCQlmb3IgKE9STUdlbkNvbHVtbiBjb2wgOiBjb2xzKSB7Ci0JCQkJaWYgKGNvbC5nZXROYW1lKCkuZXF1YWxzKGNvbHVtbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNsYXVzZSB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgZXF1YWxzKCkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlFcXVhbHNDbGF1c2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJdGhpcy5wcmludFByaW1hcnlLZXlFcXVhbHNDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgYnVmKTsKLQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCWJ1Zi5hcHBlbmQoIlxuIik7Ci0JCQkJYnVmLmFwcGVuZCgiXHRcdFx0Iik7Ci0JCQkJYnVmLmFwcGVuZCgiJiYgIik7Ci0JCQl9Ci0JCX0KLQkJYnVmLmFwcGVuZCgiOyIpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmdldERiQ29sdW1uKCkuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKGZpZWxkTmFtZSwgYnVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1pdGl2ZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCWJ1Zi5hcHBlbmQoIih0aGlzLiIpOwotCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCWJ1Zi5hcHBlbmQoIiA9PSBjYXN0T3RoZXIuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCWJ1Zi5hcHBlbmQoInRoaXMuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgiLmVxdWFscyhjYXN0T3RoZXIuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgnKScpOwotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBjbGF1c2UgdG8gYmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGhhc0NvZGUoKSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCUl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWJ1Zi5hcHBlbmQoImhhc2ggPSBoYXNoICogcHJpbWUgKyAiKTsKLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoJzsnKTsKLQkJCWJ1Zi5hcHBlbmQoJ1xuJyk7Ci0JCQlidWYuYXBwZW5kKCJcdFx0Iik7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZU9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmdldERiQ29sdW1uKCkuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSwgZmllbGROYW1lLCBidWYpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgcHJpbWl0aXZlTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJpbnQiKSkgewotCQkJLy8gdGhpcy52YWx1ZQotCQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsgLy8gZXhwbGljaXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzdAotCQkJLy8gKChpbnQpIHRoaXMudmFsdWUpCi0JCQlidWYuYXBwZW5kKCIoKGludCkgdGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoJyknKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygibG9uZyIpKSB7IC8vIGNyaWJiZWQgZnJvbSBMb25nI2hhc2hDb2RlKCkKLQkJCS8vICgoaW50KSAodGhpcy52YWx1ZSBeICh0aGlzLnZhbHVlID4+PiAzMikpKQotCQkJYnVmLmFwcGVuZCgiKChpbnQpICh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiIF4gKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIgPj4+IDMyKSkpIik7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImZsb2F0IikpIHsgLy8gY3JpYmJlZCBmcm9tCi0JCQkJCQkJCQkJCQkJLy8gRmxvYXQjaGFzaENvZGUoKQotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlidWYuYXBwZW5kKCJqYXZhLmxhbmcuRmxvYXQiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5mbG9hdFRvSW50Qml0cyh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgnKScpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJkb3VibGUiKSkgeyAvLyBjcmliYmVkIGZyb20KLQkJCQkJCQkJCQkJCQkvLyBEb3VibGUjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpIChqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpcy52YWx1ZSkgXgotCQkJLy8gKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSA+Pj4gMzIpKSkKLQkJCWJ1Zi5hcHBlbmQoIigoaW50KSAoIik7Ci0JCQlidWYuYXBwZW5kKCJqYXZhLmxhbmcuRG91YmxlIik7Ci0JCQlidWYuYXBwZW5kKCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiKSBeICgiKTsKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIpID4+PiAzMikpKSIpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsKLQkJCS8vICh0aGlzLnZhbHVlID8gMSA6IDApCi0JCQlidWYuYXBwZW5kKCIodGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiA/IDEgOiAwKSIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwcmltaXRpdmVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCIuaGFzaENvZGUoKSIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAibmFtZT0iICsgdGhpcy5nZXROYW1lKCkgKyAiOyBjb2x1bW5zPSIgKyBBcnJheXMudG9TdHJpbmcodGhpcy5nZXRDb2x1bW5OYW1lcygpLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyogY2xhc3Mgc2NvcGVzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX1NDT1BFID0gInB1YmxpYyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfU0NPUEUgPSAicHJvdGVjdGVkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEVfU0NPUEUgPSAicHJpdmF0ZSI7Ci0KLQkvKiBhY2Nlc3MgY29uc3RhbnRzLiBOb3RlIHRoYXQgdGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgdWkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQ0NFU1MgPSAicHJvcGVydHkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQUNDRVNTID0gImZpZWxkIjsKLQotCS8qCi0JICogZGVmYXVsdCBmZWNoIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gdGhlIGdlbgotCSAqIHZlbG9jaXR5IHRlbXBsYXRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZFVENIID0gImRlZmF1bHRGZXRjaCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVpZX0ZFVENIID0gImxhenkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFHRVJfRkVUQ0ggPSAiZWFnZXIiOwotCi0JLyoKLQkgKiBkZWZhdWx0IGNvbGxlY3Rpb24gdHlwZSBjb25zdGFudHMuIE5vdGUgdGhhdCB0aGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluCi0JICogdGhlIGdlbiB2ZWxvY2l0eSB0ZW1wbGF0ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9DT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkxpc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0NPTExFQ1RJT05fVFlQRSA9ICJqYXZhLnV0aWwuU2V0IjsKLQotCS8qKgotCSAqIFRoZSBwYXR0ZXJuIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGluIHRoZSBpZCBnZW5lcmF0b3Igc2VxdWVuY2UgbmFtZQotCSAqIHBhcmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1NFUV9QQVRURVJOID0gIiR0YWJsZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGF0dGVybiByZXBsYWNlZCBieSB0aGUgcHJpbWFyeSBrZXkgaW4gdGhlIGlkIGdlbmVyYXRvciBzZXF1ZW5jZSBuYW1lCi0JICogcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfU0VRX1BBVFRFUk4gPSAiJHBrIjsKLQotCS8qIGN1c3RvbWl6YXRpb24gcHJvcGVydGllcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInBhY2thZ2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19GT0xERVIgPSAic3JjRm9sZGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfREVTQyA9ICJjbGFzc0Rlc2MiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1NDT1BFID0gImNsYXNzU2NvcGUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFMgPSAiZXh0ZW5kcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UUyA9ICJpbXBsZW1lbnRzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9HRU5FUkFUT1IgPSAiaWRHZW5lcmF0b3IiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFID0gInNlcXVlbmNlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT1NJVEVfS0VZX0NMQVNTX05BTUUgPSAiY29tcG9zaXRlS2V5Q2xhc3NOYW1lIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRfRVFVQUxTID0gImltcGxlbWVudEVxdWFscyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTID0gImFjY2VzcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUgPSAiZGVmYXVsdENvbGxlY3Rpb25UeXBlIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT3ZlcndyaXRlQ29uZmlybWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJmMjdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT3ZlcndyaXRlQ29uZmlybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGdlbmVyYXRvciBzaG91bGQgb3ZlcndyaXRlIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLgotCSAqLwotCWJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpOwotCi0KLQlmaW5hbCBjbGFzcyBBbHdheXMgaW1wbGVtZW50cyBPdmVyd3JpdGVDb25maXJtZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBBbHdheXMoKTsKLQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEFsd2F5cygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5BbHdheXMiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlmaW5hbCBjbGFzcyBOZXZlciBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IE5ldmVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOZXZlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzZDY0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmFwcC5WZWxvY2l0eUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUubG9nLkpka0xvZ0NodXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkNvbXBpbGF0aW9uVW5pdE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuVXJsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhIHBhY2thZ2Ugb2YgZW50aXRpZXMgZm9yIGEgc2V0IG9mIHRhYmxlcy4KLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VHZW5lcmF0b3IgeyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuZW50aXRpZXMuZ2VuLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQlwcml2YXRlIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyID0gbnVsbDsKLQotCXN0YXRpYyBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVDb25maXJtZXIoT3ZlcndyaXRlQ29uZmlybWVyIGNvbmZpcm1lcil7Ci0JCW92ZXJ3cml0ZUNvbmZpcm1lciA9IGNvbmZpcm1lcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGN1c3RvbWl6ZXIKLQkgKiBAcGFyYW0gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbAotCSAqIEBwYXJhbSBjb3B5SmRiY0RyaXZlCi0JICogQHRocm93cyBFeGNlcHRpb24gCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QganBhUHJvamVjdCwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBhY2thZ2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFBhY2thZ2VHZW5lcmF0b3IoKTsKLQkJZ2VuZXJhdG9yLnNldFByb2plY3QoanBhUHJvamVjdCk7Ci0JCWdlbmVyYXRvci5zZXRDdXN0b21pemVyKGN1c3RvbWl6ZXIpOwotCQkKLQkJdHJ5IHsKLQkJCWdlbmVyYXRvci5kb0dlbmVyYXRlKG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRHZW5QbHVnaW4uUExVR0lOX0lELCBKcHRHZW5NZXNzYWdlcy5FcnJvcl9HZW5lcmF0aW5nX0VudGl0aWVzLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3VzdG9taXplcihPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIyKSB7Ci0JCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXIyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UHJvamVjdChKcGFQcm9qZWN0IHByb2ogKXsKLQkJdGhpcy5qcGFQcm9qZWN0ID0gcHJvajsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9HZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2VuZXJhdGVJbnRlcm5hbCggbW9uaXRvciApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW50ZXJuYWwoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcGxEaXIgPSBwcmVwYXJlVGVtcGxhdGVzRm9sZGVyKCk7Ci0KLQkJTGlzdDxTdHJpbmc+IGdlbkNsYXNzZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gdGhpcy5jdXN0b21pemVyLmdldEdlblRhYmxlTmFtZXMoKTsKLQotCQkvKiAuamF2YSBwZXIgdGFibGUsIHBlcnNpc3RlbmNlLnhtbCwgcmVmcmVzaCBwYWNrYWdlIGZvbGRlciAqLwotCQlTdHJpbmcgdGFza05hbWUgPSBOTFMuYmluZChKcHRHZW5NZXNzYWdlcy5FbnRpdHlHZW5lcmF0b3JfdGFza05hbWUsICJUb3RhbCAiKyB0YWJsZU5hbWVzLnNpemUoKSArIDIpOy8vJE5PTi1OTFMtMSQKLQkJcHJvZ3Jlc3MuYmVnaW5UYXNrKHRhc2tOYW1lLCB0YWJsZU5hbWVzLnNpemUoKSArIDIpOwotCi0KLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB0YWJsZU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJT1JNR2VuVGFibGUgdGFibGUgPSBjdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZSk7Ci0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0YWJsZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQotCQkJZ2VuZXJhdGVDbGFzcyh0YWJsZSwgdGVtcGxEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHByb2dyZXNzKTsKLQkJCXByb2dyZXNzLndvcmtlZCgxKTsKLQotCQkJZ2VuQ2xhc3Nlcy5hZGQoIGNsYXNzTmFtZSApOwotCQkJLyoKLQkJCSAqIGFkZCB0aGUgY29tcG9zaXRlIGtleSBjbGFzcyB0byBwZXJzaXN0ZW5jZS54bWwgYmVjYXVzZSBzb21lIAotCQkJICogSlBBIHByb3ZpZGVyKGUuZy4gS29kbykgcmVxdWlyZXMgaXQuIEhpYmVybmF0ZSBkb2Vzbid0IHNlZW0gdG8gY2FyZSkuIAotCQkJICovCi0JCQlpZiAodGFibGUuaXNDb21wb3NpdGVLZXkoKSkgewotCQkJCWdlbkNsYXNzZXMuYWRkKHRhYmxlLmdldFF1YWxpZmllZENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy91cGRhdGUgcGVyc2lzdGVuY2UueG1sCi0JCWlmICh0aGlzLmN1c3RvbWl6ZXIuc2hvdWxkVXBkYXRlUGVyc2lzdGVuY2VYbWwoKSkgewotCQkJdXBkYXRlUGVyc2lzdGVuY2VYbWwoZ2VuQ2xhc3Nlcyk7Ci0JCX0KLQkJcHJvZ3Jlc3MuZG9uZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VYbWwoZmluYWwgTGlzdDxTdHJpbmc+IGdlbkNsYXNzZXMpIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCS8vdGhlIHJlc291cmNlIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgaGFkIGFuIGludmFsaWQgY29udGVudCB0eXBlLAotCQkJLy9kbyBub3QgYXR0ZW1wdCB0byB1cGRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlc291cmNlLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJCQkvLyBpbnZhbGlkIGNvbnRlbnQsIGRvIG5vdCBhdHRlbXB0IHRvIHVwZGF0ZQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0JCQkJLy8gY3JlYXRlIGEgcGVyc2lzdGVuY2UgdW5pdCBpZiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0Ci0JCQkJaWYgKHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkgPT0gMCkgewotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5hZGRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCQkJcGVyc2lzdGVuY2VVbml0LnNldE5hbWUoanBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgcGVyc2lzdGVuY2UgdW5pdCAtIHRha2UgdGhlIGZpcnN0IG9uZQotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gZ2VuQ2xhc3Nlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKCFwZXJzaXN0ZW5jZVVuaXQubWFwcGluZ0ZpbGVSZWZzQ29udGFpbmluZyhjbGFzc05hbWUpLmhhc05leHQoKSAmJiAhcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllc1BlcnNpc3RlbnRUeXBlKGNsYXNzTmFtZSkpIHsKLQkJCQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKCk7Ci0JCQkJCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIHByZXBhcmVUZW1wbGF0ZXNGb2xkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24gewotCQkvL1ByZXBhcmUgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIGZvbGRlcjoKLQkJLy9JZiB0aGUgcGx1Zy1pbiBpcyBwYWNrYWdlZCBhcyBhIEpBUiwgd2UgbmVlZCBleHRyYWN0IHRoZSB0ZW1wbGF0ZSAKLQkJLy9mb2xkZXIgaW50byB0aGUgcGx1Zy1pbiBzdGF0ZSBsb2NhdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBWZWxvY2l0eQotCQkvL3NpbmNlIHdlIHVzZSBpbmNsdWRlZCB0ZW1wbGF0ZXMuCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCVN0cmluZyB0ZW1wbGF0ZXNQYXRoID0gInRlbXBsYXRlcy9lbnRpdGllcy8iOyAgLy8kTk9OLU5MUy0xJAotCQlQYXRoIHBhdGggPSBuZXcgUGF0aCggdGVtcGxhdGVzUGF0aCk7Ci0JCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCWlmICggdXJsID09bnVsbCAgKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsICBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiICIrICBKcHRHZW5QbHVnaW4uUExVR0lOX0lEICsgIi8iICsgdGVtcGxhdGVzUGF0aCkgKTsvLyROT04tTkxTLTEkCi0JCX0JCQotCQlVUkwgdGVtcGxVcmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQotCQkvL0hhdmUgdGhpcyBjaGVjayBzbyB0aGF0IHRoZSBjb2RlIHdvdWxkIHdvcmsgaW4gYm90aCBQREUgYW5kIEpBUmVkIHBsdWctaW4gYXQgcnVudGltZQotCQlGaWxlIHRlbXBsRGlyID0gbnVsbDsKLQkJaWYoIFVybFV0aWwuaXNKYXJVcmwodGVtcGxVcmwpICl7Ci0JCQl0ZW1wbERpciA9IEZpbGVVdGlsLmV4dHJhY3RGaWxlc0Zyb21CdW5kbGUoIHRlbXBsVXJsLCBidW5kbGUsIHRlbXBsYXRlc1BhdGggKTsKLQkJfWVsc2V7Ci0JCQl0ZW1wbERpciA9IFVybFV0aWwuZ2V0VXJsRmlsZSh0ZW1wbFVybCk7Ci0JCX0KLQkJCi0KLQkJaWYgKHRlbXBsRGlyPT1udWxsIHx8ICF0ZW1wbERpci5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRHZW5QbHVnaW4uUExVR0lOX0lELCAgSnB0R2VuTWVzc2FnZXMuVGVtcGxhdGVzX25vdEZvdW5kICsgIiAiKyAgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCApICk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0ZW1wbERpcjsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMvQ3JlYXRlcyB0aGUgLmphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGEgZGF0YWJhc2UgdGFibGUgCi0JICogd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxEaXIgVGhlIHZlbG9jaXR5IHRlbXBsYXRlIGZpbGUgZGlyZWN0b3J5LiBJdCBpcyBhc3N1bWVkIAotCSAqIHRoYXQgdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDIgZmlsZXMgPGVtPm1haW4uamF2YS52bTwvZW0+IAotCSAqIGFuZCA8ZW0+cGsuamF2YS52bTwvZW0+IAotCSAqIEBwYXJhbSBwcm9ncmVzcyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNsYXNzKE9STUdlblRhYmxlIHRhYmxlLCBTdHJpbmcgdGVtcGxhdGVEaXJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBzdWJUYXNrTmFtZSA9IE5MUy5iaW5kKEpwdEdlbk1lc3NhZ2VzLkVudGl0eUdlbmVyYXRvcl90YXNrTmFtZSwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBzdWJUYXNrTmFtZSwgMTAwKTsKLQotCQl0cnl7Ci0JCQlJRm9sZGVyIGphdmFQYWNrYWdlRm9sZGVyID0gZ2V0SmF2YVBhY2thZ2VGb2xkZXIodGFibGUsIG1vbml0b3IpOwotCQkJSUZpbGUgamF2YUZpbGUgPSBqYXZhUGFja2FnZUZvbGRlci5nZXRGaWxlKCB0YWJsZS5nZXRDbGFzc05hbWUoKSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmKCBqYXZhRmlsZS5leGlzdHMoKSApewotCQkJCWlmKCBvdmVyd3JpdGVDb25maXJtZXIhPW51bGwgJiYgIW92ZXJ3cml0ZUNvbmZpcm1lci5vdmVyd3JpdGUoamF2YUZpbGUuZ2V0TmFtZSgpKSApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vSmRrTG9nQ2h1dGUgaW4gdGhpcyB2ZXJzaW9uIG9mIFZlbG9jaXR5IG5vdCBhbGxvdyB0byBzZXQgbG9nIGxldmVsCi0JCQkvL1dvcmthcm91bmQgYnkgcHJlc2V0IHRoZSBsb2cgbGV2ZWwgYmVmb3JlIFZlbG9jaXR5IGlzIGluaXRpYWxpemVkCi0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUUgKTsKLQkJCWxvZ2dlci5zZXRMZXZlbCggTGV2ZWwuU0VWRVJFICk7Ci0JCQkKLQkJCVByb3BlcnRpZXMgdmVwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXZlcC5zZXRQcm9wZXJ0eSgiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlRGlyUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcC5zZXRQcm9wZXJ0eSggSmRrTG9nQ2h1dGUuUlVOVElNRV9MT0dfSkRLX0xPR0dFUiwgTE9HR0VSX05BTUUgKTsKLQkJCVZlbG9jaXR5RW5naW5lIHZlID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0JCSAgICB2ZS5pbml0KHZlcCk7Ci0JCSAgICBzbS53b3JrZWQoMjApOwotCQkgICAgCi0JCSAgICBnZW5lcmF0ZUphdmFGaWxlKHRhYmxlLCBqYXZhRmlsZSwgdmUsICJtYWluLmphdmEudm0iLCB0cnVlLyppc0RvbWFpbkNsYXNzKi8sIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCi0JCSAgICBzbS53b3JrZWQoODApOwotCQkgICAgCi0JCSAgICBpZiAodGFibGUuaXNDb21wb3NpdGVLZXkoKSkgewotCQkgICAgCUlGaWxlIGNvbXBvc2l0ZUtleUZpbGUgPSBqYXZhUGFja2FnZUZvbGRlci5nZXRGaWxlKCB0YWJsZS5nZXRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSsiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCWdlbmVyYXRlSmF2YUZpbGUodGFibGUsIGNvbXBvc2l0ZUtleUZpbGUsIHZlLCAicGsuamF2YS52bSIsIGZhbHNlLyppc0RvbWFpbkNsYXNzKi8sIG1vbml0b3IgKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgfQotCQkgICAgCi0JCQlqYXZhRmlsZS5yZWZyZXNoTG9jYWwoMSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkKLQkJfSBjYXRjaChUaHJvd2FibGUgZSl7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRHZW5QbHVnaW4uUExVR0lOX0lELCBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiIiArIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQgLCBlKSApOy8vJE5PTi1OTFMtMSQKLQkJCUpwdEdlblBsdWdpbi5sb2dFeGNlcHRpb24oIGNlICk7Ci0JCX0KLQkJc20uc2V0V29ya1JlbWFpbmluZygwKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF2YUZpbGUoT1JNR2VuVGFibGUgdGFibGUsIElGaWxlIGphdmFGaWxlLCBWZWxvY2l0eUVuZ2luZSB2ZQotCQkJLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBib29sZWFuIGlzRG9tYWluQ2xhc3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnB1dCgidGFibGUiLCB0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29udGV4dC5wdXQoImN1c3RvbWl6ZXIiLCBnZXRDdXN0b21pemVyKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotCQlTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdmUubWVyZ2VUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGNvbnRleHQsIHcpOwotCQkKLQkJU3RyaW5nIGZpbGVDb250ZW50ID0gdy50b1N0cmluZygpOwotCQlpZiAoamF2YUZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmIChpc0RvbWFpbkNsYXNzKSB7Ci0JCQkJdXBkYXRlRXhpc3RpbmdEb21haW5DbGFzcyh0YWJsZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSwgamF2YUZpbGUsIGZpbGVDb250ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJamF2YUZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVDb250ZW50LmdldEJ5dGVzKCkpLCB0cnVlLCB0cnVlLCBtb25pdG9yICk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGaWxlKGphdmFGaWxlLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmlsZUNvbnRlbnQuZ2V0Qnl0ZXMoKSkpOwotCQl9CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgKGV4aXN0aW5nKSBKYXZhIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGphdmFGaWxlIFRoZSBleGlzdGluZyBKYXZhIGZpbGUgb2YgdGhlIGNsYXNzIHRvIHVwZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZUNvbnRlbnQgVGhlIG5ldyBmaWxlIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXhpc3RpbmdEb21haW5DbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBJRmlsZSBqYXZhRmlsZSwgU3RyaW5nIGZpbGVDb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLyp1c2UgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIgaW5zdGVhZCBvZiBjYWxsaW5nIFdpZGVFbnYuZ2V0RW52KCkuc2V0RmlsZUNvbnRlbnQgCi0JCSAqIHNvIHRoYXQgaWYgdGhlIHVuaXQgaXMgdXAgdG8gZGF0ZSBpZiBpdCBpcyB1c2VkIGJlZm9yZSBmaWxlIGNoYW5nZSAKLQkJICogbm90aWZpY2F0aW9ucyBhcmUgZGVsaXZlcmVkIChzZWUgRUpCM0ltcG9ydFNjaGVtYVdpemFyZC51cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzIGZvciBleGFtcGxlKSovCi0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlDb21waWxhdGlvblVuaXRNb2RpZmllciBtb2RpZmllciA9IG5ldyBDb21waWxhdGlvblVuaXRNb2RpZmllcihwcm9qZWN0LCBjbGFzc05hbWUpOwotCQltb2RpZmllci5zZXRKYXZhU291cmNlKGZpbGVDb250ZW50KTsKLQkJbW9kaWZpZXIuc2F2ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlKElGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQlmaWxlLmNyZWF0ZShjb250ZW50cywgZmFsc2UsIG51bGwvKm1vbml0b3IqLyk7Ci0JfQotCQotCXB1YmxpYyBJRm9sZGVyIGdldEphdmFQYWNrYWdlRm9sZGVyKE9STUdlblRhYmxlIHRhYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERlZmF1bHRKYXZhU3JvdWNlTG9jYXRpb24gKCBnZXRKYXZhUHJvamVjdCgpICwgdGFibGUuZ2V0U291cmNlRm9sZGVyKCkpIDsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gdGFibGUuZ2V0UGFja2FnZSgpOwotCQlpZiggcGFja2FnZU5hbWU9PW51bGwgKSBwYWNrYWdlTmFtZSA9IiI7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQlpZiggIXBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSl7Ci0JCQlyb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCX0JCQotCQlyZXR1cm4gKElGb2xkZXIpcGFja2FnZUZyYWdtZW50LmdldFJlc291cmNlKCk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCl7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREZWZhdWx0SmF2YVNyb3VjZUxvY2F0aW9uKElKYXZhUHJvamVjdCBqcHJvamVjdCwgU3RyaW5nIHNvdXJjZUZvbGRlcil7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IGRlZmF1bHRTcmNQYXRoID0gbnVsbDsKLQkJaWYgKGpwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGpwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChyb290c1tpXS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgKXsKLQkJCQkJCQlpZiggaSA9PSAwICkgCi0JCQkJCQkJCWRlZmF1bHRTcmNQYXRoID0gcm9vdHNbaV07Ci0JCQkJCQkJU3RyaW5nIHBhdGggPSByb290c1tpXS5nZXRQYXRoKCkudG9TdHJpbmcoKTsgCi0JCQkJCQkJaWYoIHBhdGguZXF1YWxzKCAiLyIrc291cmNlRm9sZGVyICkpIHsKLQkJCQkJCQkJcmV0dXJuIHJvb3RzW2ldIDsgCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkJCQotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0R2VuUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFNyY1BhdGg7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIG5hbWUgYnVpbGRlciAqKioqKioqKioqCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvVGFnTmFtZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvVGFnTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4N2U1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLS8qKgotICogVE9ETzogbWVyZ2Ugd2l0aCBKUEEgY2xhc3MgPwotICogVGhlIEpQQSBtYXBwaW5nIHRhZyBhbmQgYXR0cmlidXRlIG5hbWVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdOYW1lcwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX1RBRyA9ICJiYXNpYyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTQ0FERV9UQUcgPSAiY2FzY2FkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBRyA9ICJjb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX1RBRyA9ICJlbWJlZGRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERURfSURfVEFHID0gImVtYmVkZGVkLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfVkFMVUVfVEFHID0gImdlbmVyYXRlZC12YWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DTEFTU19UQUcgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1RBRyA9ICJqb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUcgPSAiaW52ZXJzZS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9CX1RBRyA9ICJsb2IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWV9UQUcgPSAibWFueS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX09ORV9UQUcgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9UQUcgPSAibWFwcGVkLWJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fTUFOWV9UQUcgPSAib25lLXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkVfVEFHID0gIm9uZS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0pPSU5fQ09MVU1OX1RBRyA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVEFHID0gInRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RBRyA9ICJ2ZXJzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX1RBRyA9ICJqb2luLXRhYmxlIjsKLQotCS8qY2FzY2FkZSB0YWdzKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQ0FTQ0FERSA9ICJhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RfQ0FTQ0FERSA9ICJwZXJzaXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9DQVNDQURFID0gIm1lcmdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQ0FTQ0FERSA9ICJyZW1vdmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfQ0FTQ0FERSA9ICJyZWZyZXNoIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0NvbXBpbGF0aW9uVW5pdE1vZGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmYwMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0NvbXBpbGF0aW9uVW5pdE1vZGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0KLS8qKgotICogUGVyZm9ybXMgdGhlIGdydW50IHdvcmsgbmVlZGVkIGZvciBtb2RpZnlpbmcgYSBjb21waWxhdGlvbiAKLSAqIHVuaXQgYW5kIHBlcmZvcm1zIHRoZSBtb2RpZmllZCBjb21waWxhdGlvbiB1bml0IHNhdmUuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKiA8b2w+PGxpPkNyZWF0ZSBhbiBpbnN0YW5jZS4KLSAqIAotICogPGxpPk1vZGlmeSB0aGUgY29tcGlsYXRpb24gdW5pdCB1c2luZyBBU1Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgCi0gKiAJb24gdGhlIG5vZGUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDb21waWxhdGlvblVuaXROb2RlKCl9LgotICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiBjYWxsIDxjb2RlPnNldEphdmFTb3VyY2U8L2NvZGU+IHRvIGNoYW5nZSB0aGUgZW50aXJlIHNvdXJjZSBjb2RlLiAKLSAqIAotICogPGxpPkNhbGwgdGhlIHtAbGluayAjc2F2ZSgpfSBtZXRob2QuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyCi17Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgbVByb2plY3Q7Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IG1Db21waWxhdGlvblVuaXQ7Ci0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgbUNvbXBpbGF0aW9uVW5pdE5vZGU7Ci0JcHJpdmF0ZSBEb2N1bWVudCBtRG9jdW1lbnQ7Ci0JCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Qcm9qZWN0ID0gcHJvamVjdDsKLQkJCi0JCUlUeXBlIHR5cGUgPSBwcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKLQkJfQotCQltQ29tcGlsYXRpb25Vbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKG1Db21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHNvdXJjZSBjb2RlIGZvciAiICsgY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKLQkJfQotCX0KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbVByb2plY3QgPSBwcm9qZWN0OwotCQltQ29tcGlsYXRpb25Vbml0ID0gY3U7Ci0JfQotCXB1YmxpYyBDb21waWxhdGlvblVuaXRNb2RpZmllcihJSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgQ29tcGlsYXRpb25Vbml0IGN1Tm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltUHJvamVjdCA9IHByb2plY3Q7Ci0JCW1Db21waWxhdGlvblVuaXQgPSBjdTsKLQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUgPSBjdU5vZGU7Ci0JCQotCQlnZXRDb21waWxhdGlvblVuaXROb2RlKCk7IC8vdG8gY3JlYXRlIG1Eb2N1bWVudCAodGhlIGNhbGxlciBpbiB0aGlzIGNhc2UgZG9lcyBub3QgaGF2ZSB0byBjYWxsIGdldENvbXBpbGF0aW9uVW5pdE5vZGUpCi0JfQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIG1Db21waWxhdGlvblVuaXQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciAKLQkgKiB0eWhlIG1vZGlmaWNhdGlvbiBBU1Qgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdE5vZGUoKSB7Ci0JCWlmIChtQ29tcGlsYXRpb25Vbml0Tm9kZSA9PSBudWxsKSB7Ci0JCQlBU1RQYXJzZXIgYyA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQkJYy5zZXRTb3VyY2UobUNvbXBpbGF0aW9uVW5pdCk7Ci0JCQljLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJCW1Db21waWxhdGlvblVuaXROb2RlID0gKENvbXBpbGF0aW9uVW5pdCljLmNyZWF0ZUFTVChudWxsKTsKLQkJfQotCQlpZiAobURvY3VtZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbURvY3VtZW50ID0gbmV3IERvY3VtZW50KG1Db21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQkKLQkJCW1Db21waWxhdGlvblVuaXROb2RlLnJlY29yZE1vZGlmaWNhdGlvbnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1Db21waWxhdGlvblVuaXROb2RlOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbnRpcmUgSmF2YSBzb3VyY2UgY29kZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhU291cmNlKFN0cmluZyBuZXdTb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCW1Db21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMobmV3U291cmNlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbW9kaWZpY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChtQ29tcGlsYXRpb25Vbml0Tm9kZSAhPSBudWxsKSB7Ci0JCQlhc3NlcnQobURvY3VtZW50ICE9IG51bGwpOyAvL3NlZSBnZXRDb21waWxhdGlvblVuaXROb2RlCi0JCQkKLQkJCS8vY29tcHV0YXRpb24gb2YgdGhlIHRleHQgZWRpdHMKLQkJCVRleHRFZGl0IGVkaXRzID0gbUNvbXBpbGF0aW9uVW5pdE5vZGUucmV3cml0ZShtRG9jdW1lbnQsIG1Qcm9qZWN0LmdldE9wdGlvbnModHJ1ZSkpOwotCQkJLy9jb21wdXRhdGlvbiBvZiB0aGUgbmV3IHNvdXJjZSBjb2RlCi0JCQllZGl0cy5hcHBseShtRG9jdW1lbnQpOwotCQkJU3RyaW5nIG5ld1NvdXJjZSA9IG1Eb2N1bWVudC5nZXQoKTsKLQkJCS8vIHVwZGF0ZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCQkJbUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdTb3VyY2UpOwotCQl9Ci0JCQotCQlpZiAobUNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCW1Db21waWxhdGlvblVuaXQuY29tbWl0V29ya2luZ0NvcHkodHJ1ZS8qZm9yY2UqLywgbnVsbC8qbW9uaXRvciovKTsKLQkJfSBlbHNlIHsKLQkJCW1Db21waWxhdGlvblVuaXQuc2F2ZShudWxsLyptb25pdG9yKi8sIHRydWUvKmZvcmNlKi8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0RUUFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTcxZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0RUUFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5LkNvbHVtblBhaXI7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB1dGlsaXR5IG1ldGhvZHMgdG8gYWNjZXNzIERUUCBhbmQgb3RoZXIganB0LmRiIEFQSXMgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRFRQVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvSW5jcmVtZW50KENvbHVtbiBjKXsKLQkJLy9AIFRPRE8KLQkJLy9CbG9ja2VkIGJ5IERUUCBidWcKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMDIzCi0JCS8vVGhlIERhbGkgYnVnIGlzCi0JCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTY1OAotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmsKLQkgKiBAcGFyYW0gZGJUYWJsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Rm9yZWlnbktleUluZm8+IGdldEZvcmVpZ25LZXlzKFRhYmxlIGRiVGFibGUpIHsKLQkJTGlzdDxGb3JlaWduS2V5SW5mbz4gcmV0ID0gbmV3IEFycmF5TGlzdDxGb3JlaWduS2V5SW5mbz4oKTsKLQkJaWYoZGJUYWJsZSE9bnVsbCl7Ci0JCQlmb3IgKEZvcmVpZ25LZXkgZmsgOiBkYlRhYmxlLmdldEZvcmVpZ25LZXlzKCkpIHsKLQkJCQlJdGVyYXRvcjxDb2x1bW5QYWlyPiBjb2x1bW5QYWlyZXMgPSBmay5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7Ci0JCQkJRm9yZWlnbktleUluZm8gZmtJbmZvID0gbnVsbDsKLQkJCQl3aGlsZSggY29sdW1uUGFpcmVzLmhhc05leHQoKSApewotCQkJCQlDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSBjb2x1bW5QYWlyZXMubmV4dCgpOwotCQkJCQlpZiggZmtJbmZvID09IG51bGwpewotCQkJCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGRiVGFibGUuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUgPSAiIjsKLQkJCQkJCVRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQkJCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXROYW1lKCk7Ci0JCQkJCQlma0luZm8gPSBuZXcgRm9yZWlnbktleUluZm8oZmssIHRhYmxlTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSApOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCQlma0luZm8uYWRkQ29sdW1uTWFwcGluZyggYmFzZUNvbE5hbWUsICByZWZlcmVuY2VkQ29sTmFtZSApOwotCQkJCX0gCi0JCQkJaWYoIGZrSW5mbyAhPW51bGwgKQotCQkJCQlyZXQuYWRkKCBma0luZm8gKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFUeXBlKENvbHVtbiBkYkNvbHVtbikgewotCQlyZXR1cm4gZGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgPwotCQkJCWRiQ29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkgOgotCQkJCWRiQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0U2NoZW1hKFRhYmxlIGRiVGFibGUpewotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0TmFtZSgpOwotCQlTY2hlbWEgZGVmYXVsdFNjaGVtYSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIGRlZmF1bHRTY2hlbWEuZ2V0TmFtZSgpID09IHNjaGVtYU5hbWU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9FbnRpdHlHZW5Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzVlZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuVG9vbHMgewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBjbGFzcyBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShTdHJpbmcgaWRlbnRpZmllciwgQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgdHJ1ZSwgY2xhc3NOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGlkZW50aWZpZXIsIENvbGxlY3Rpb248U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcykgewotCQlyZXR1cm4gY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihpZGVudGlmaWVyLCBmYWxzZSwgYXR0cmlidXRlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogaWRlbnRpZmllcjoKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBhbGwtY2FwcywgY29udmVydCB1bmRlcnNjb3JlcyB0byAiY2FtZWwgY2FzZSIKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgYWxsLWNhcHMsIGxlYXZlIGl0IHVuY2hhbmdlZCAoZXhjZXB0LCBwb3NzaWJseSwgZm9yIHRoZSBmaXJzdCBsZXR0ZXIpCi0JICogICAgIC0gY29udmVydCB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgotCSAqICAgICAgICAgLSBlbGltaW5hdGUgaWxsZWdhbCBjaGFyYWN0ZXJzCi0JICogICAgICAgICAtIGlmIHRoZSByZXN1bHQgaXMgYSByZXNlcnZlZCB3b3JkLCBtb2RpZnkgaXQgc2xpZ2h0bHkKLQkgKiBJZiB0aGUgcmVzdWx0IGlzIGFscmVhZHkgb25lIG9mIHRoZSBzcGVjaWZpZWQgZXhpc3RpbmcgaWRlbnRpZmllcnMKLQkgKiAoaWdub3JpbmcgY2FzZSBzbyB3ZSBkb24ndCBoYXZlIGZpbGVuYW1lIGNvbGxpc2lvbnMgb24gV2luZG93cyksCi0JICogbW9kaWZ5IGl0IHNsaWdodGx5IGFnYWluLgotCSAqICAgICAiRk9PIiA9PiAiRm9vIiBvciAiZm9vIgotCSAqICAgICAiRk9PX0JBUiIgPT4gIkZvb0JhciIgb3IgImZvb0JhciIKLQkgKiAgICAgIlBBQ0tBR0UiID0+ICJQYWNrYWdlIiBvciAicGFja2FnZV8iCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIENvbGxlY3Rpb248U3RyaW5nPiBpZGVudGlmaWVycykgewotCQlTdHJpbmcgcmVzdWx0ID0gaWRlbnRpZmllcjsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHJlc3VsdCkgfHwgU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UocmVzdWx0KSkgewotCQkJLy8gbGVhdmUgbWl4ZWQgY2FzZSBpZGVudGlmaWVycyBhbG9uZT8KLQkJCXJlc3VsdCA9IFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHJlc3VsdCwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNhcGl0YWxpemVGaXJzdExldHRlciA/IFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocmVzdWx0KSA6IFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShyZXN1bHQpOwotCQl9Ci0JCXJlc3VsdCA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihyZXN1bHQpOwotCQkvLyBhc3N1bWUgdGhhdCBjb252ZXJ0aW5nIHRvIGEgdW5pcXVlIG5hbWUgd2lsbCBub3QgcmVzdWx0IGluIGEgSmF2YSByZXNlcnZlZCB3b3JkCi0JCS8vIChzaW5jZSBubyBKYXZhIHJlc2VydmVkIHdvcmRzIGVuZCB3aXRoIGEgbnVtYmVyKQotCQlyZXN1bHQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UocmVzdWx0LCBpZGVudGlmaWVycyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlHZW5Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdjYTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbGxlY3Rpb25zIG9mIHV0aWxpdHkgbWV0aG9kcyBoYW5kbGluZyBmaWxlcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwKLXsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVMRVRFX0ZPTERFUl9FUlIgPSAiVGhlIGRpcmVjdG9yeSAlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUxFVEVfRklMRV9FUlIgPSAiVGhlIGZpbGUgJXMgY291bGQgbm90IGJlIGRlbGV0ZWQuIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklMRV9SRUFET05MWV9FUlIgPSAiVGhlIGZpbGUgJXMgY291bGQgbm90IGJlIG1vZGlmaWVkIGJlY2F1c2Ugd3JpdGUgYWNjZXNzIGlzIGRlbmllZC5cblBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcyBub3QgbWFya2VkIGFzIHJlYWRvbmx5IGluIHRoZSBmaWxlIHN5c3RlbS4iOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUZvbGRlcihGaWxlIGZvbGRlcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCS8vZW1wdHkgdGhlIGZvbGRlciBmaXJzdCAoamF2YS5pby5maWxlLmRlbGV0ZSByZXF1aXJlcyBpdCBlbXB0eSkKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlGaWxlIGYgPSBmaWxlc1tpXTsKLQkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCQlkZWxldGVGb2xkZXIoZik7Ci0JCQkJZWxzZQotCQkJCQlkZWxldGVQYXRoKGYpOwotCQkJfQotCQl9Ci0JCWRlbGV0ZVBhdGgoZm9sZGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUGF0aChGaWxlIGYpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKCFmLmRlbGV0ZSgpKSB7Ci0JCQlTdHJpbmcgbXNnSWQgPSBmLmlzRGlyZWN0b3J5KCkgPyAgREVMRVRFX0ZPTERFUl9FUlIgOiAgREVMRVRFX0ZJTEVfRVJSOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KG1zZ0lkLGYuZ2V0UGF0aCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBieXRlW10gcmVhZEZpbGUoRmlsZSBzcmMpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gZmluID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCXRyeSB7Ci0JCQlsb25nIGZpbGVMZW4gPSBzcmMubGVuZ3RoKCk7Ci0JCQlpZiAoZmlsZUxlbiA+IEludGVnZXIuTUFYX1ZBTFVFKQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmlsZSBsZW5ndGggdG9vIGJpZyB0byBiZSByZWFkIGJ5IEZpbGVVdGlsLnJlYWRGaWxlOiAiICsgZmlsZUxlbik7Ci0JCQotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbKGludClmaWxlTGVuXTsKLQkJCWZpbi5yZWFkKGJ5dGVzKTsKLQkJCXJldHVybiBieXRlczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZpbi5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShGaWxlIGRlc3QsIGJ5dGVbXSBieXRlcykKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoZGVzdC5leGlzdHMoKSAmJiAhZGVzdC5jYW5Xcml0ZSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCBGSUxFX1JFQURPTkxZX0VSUiApOyAgLy90aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgYmVjYXVzZSBvdGhlcndpc2UgRmlsZU91dHB1dFN0cmVhbSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIQotCQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZGVzdC5nZXRQYXRoKCksIGZhbHNlLyphcHBlbmQqLyk7Ci0JCXRyeSB7Ci0JCQlmb3V0LndyaXRlKGJ5dGVzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZvdXQuZmx1c2goKTsKLQkJCWZvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCBmb3IgYSBmaWxlLgotCSAqIFRoaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGZpbGUudG9VcmwoKSBidXQgd2l0aG91dCB0aGUgbm9uLXNlbnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRGaWxlVXJsKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUudG9VUkkoKS50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vc2hvdWxkIG5vdCBoYXBwZW4gYXMgZmlsZS50b1VSTCgpIGRvZXMgbm90IHJlYWxseSB0aHJvdyBhbiBleGNlcHRpb24KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlQ29udGVudChGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBpRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGlGaWxlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBwYXRoICIgKyBmaWxlICsgIiBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmFsaWQgZmlsZSBwYXRoLiIpOwotCQkJfQotCQkJaUZpbGUuc2V0Q29udGVudHMoY29udGVudHMsIHRydWUvKmZvcmNlKi8sIHRydWUvKmtlZXBIaXN0b3J5Ki8sIG51bGwvKm1vbml0b3IqLyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQkKLQkKLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiBhIEphciBhcmNoaXZlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVuamFyKElucHV0U3RyZWFtIGluLCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZGVzdC5leGlzdHMoKSkgewotICAgICAgICAgICAgZGVzdC5ta2RpcnMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWRlc3QuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBtdXN0IGJlIGEgZGlyZWN0b3J5LiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBKYXJJbnB1dFN0cmVhbSBqaW4gPSBuZXcgSmFySW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0KLSAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqaW4uZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZmlsZU5hbWUuY2hhckF0KGZpbGVOYW1lLmxlbmd0aCgpIC0gMSkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5jaGFyQXQoMCkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0LCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cwotICAgICAgICAgICAgICAgIGZpbGUubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgamluLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0gICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZHVtcCB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGppbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGppbi5jbG9zZUVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgZmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gamluLmdldE5leHRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIEV4cGxpY2l0bHkgd3JpdGUgb3V0IHRoZSBNRVRBLUlORi9NQU5JRkVTVC5NRiBzbyB0aGF0IGFueSBoZWFkZXJzIHN1Y2gKLSAgICAgICAgIGFzIHRoZSBDbGFzcy1QYXRoIGFyZSBzZWVuIGZvciB0aGUgdW5wYWNrYWdlZCBqYXIKLSAgICAgICAgICovCi0gICAgICAgIE1hbmlmZXN0IG1mID0gamluLmdldE1hbmlmZXN0KCk7Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0LCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudC5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIG1mLndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGppbi5jbG9zZSgpOwotICAgIH0KLSAgICAKLQkvL1VzZWQgdG8gVW56aXAgdGhlIGEgc3BlY2lmaWMgZm9sZGVyIHBhY2tlZCBpbnNpZGUgYSBwbHVnLWluIGJ1bmRsZSB0byB0aGUgcGx1Zy1pbiBzdGF0ZSBsb2NhdGlvbgotCXB1YmxpYyBzdGF0aWMgRmlsZSBleHRyYWN0RmlsZXNGcm9tQnVuZGxlKCBVUkwgdXJsLCBCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcGF0aCApIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgamFyVXJsID0gVXJsVXRpbC5nZXRKYXJGaWxlVXJsKHVybCk7Ci0JCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGphclVybC5nZXRGaWxlKCkgKTsKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlGaWxlIGNvbmZpZ0ZvbGRlciA9IG5ldyBGaWxlKCBjb25maWdMb2NhdGlvbi5nZXRVUkwoKS5nZXRGaWxlKCksIHBsdWdpbklkKTsKLQkJRmlsZSB0ZW1wbERpciA9IG5ldyBGaWxlKCBjb25maWdGb2xkZXIsIHBhdGggKTsKLQkJaWYoICF0ZW1wbERpci5leGlzdHMoKSApewotCQkJRmlsZVV0aWwudW5qYXIoIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGphckZpbGUgKSwgY29uZmlnRm9sZGVyICk7Ci0JCQkvL0RlbGV0ZSB1bi1yZWxhdGVkIGZpbGVzIGFuZCBmb2xkZXJzCi0JCQlGaWxlW10gZmlsZXMgPSBjb25maWdGb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IoIEZpbGUgZiA6IGZpbGVzICl7Ci0JCQkJaWYoIGYuaXNGaWxlKCkgKQotCQkJCQlmLmRlbGV0ZSgpOwotCQkJCWVsc2UgaWYoICB0ZW1wbERpci5nZXRQYXRoKCkuaW5kZXhPZiggZi5nZXRQYXRoKCkgKSAhPTAgICl7Ci0JCQkJCUZpbGVVdGlsLmRlbGV0ZUZvbGRlcihmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRlbXBsRGlyIDsKLQl9CQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRm9yZWlnbktleUluZm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWU5MWU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBtZXRhZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGZvcmVpZ24ga2V5IHJlbGF0aW9uc2hpcCAKLSAqIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBzY2hlbWEuCi0gKiA8cC8+Ci0gKiBUaGUgcmVmZXJyZXIgY29sdW1uIGlzIG9uZSB3aGljaCBhY3R1YWxseSBjb250YWlucyBhIGZvcmVpZ24gCi0gKiBrZXkgY29uc3RyYWludCwgYW5kIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJmb3JlaWduIGtleSIgY29sdW1uLgotICogPHAvPgotICogVGhlIHJlZmVyZW5jZWQgY29sdW1uIGlzIG9uZSB3aGljaCBhIHJlZmVycmVyIG9yIGZvcmVpZ24ga2V5IAotICogY29sdW1uIHJlZmVyZW5jZXMsIGFuZCBpcyBlcXVpdmFsZW50IHRvIHRoZSAicHJpbWFyeSBrZXkiIGNvbHVtbi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRm9yZWlnbktleUluZm8KLXsKLQlwcml2YXRlIHRyYW5zaWVudCBGb3JlaWduS2V5IG1Gb3JlaWduS2V5IDsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUmVmZXJyZXJUYWJsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVycmVyQ29sTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmsgVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgYmFja2luZyAKLSAgICAgKiB0aGlzIGZvcmVpZ24ga2V5IG1ldGFkYXRhIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBGb3JlaWduS2V5SW5mbyhGb3JlaWduS2V5IGZrLCBTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUsIFN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lKSB7Ci0gICAgCW1Gb3JlaWduS2V5ID0gZms7Ci0gICAgCW1OYW1lID0gZmsuZ2V0TmFtZSgpOwotICAgIAltUmVmZXJyZXJUYWJsZU5hbWUgPSByZWZlcnJlclRhYmxlTmFtZTsKLSAgICAJbVJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lOwotCX0KLSAgICAvKioKLSAgICAgKiBPYnRhaW4gdGhlIGNvbnN0cmFpbnQgbmFtZSBmb3IgdGhpcyBmb3JlaWduIGtleSBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRoZSBuYW1lIGZvciBhIEZvcmVpZ24gS2V5IG1heSwgYXMgcGVyIHRoZSBKREJDIHNwZWNpZmljYXRpb24sCi0gICAgICogYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hlcmUgdGhlIGNvbnN0cmFpbnQgaXMgbm90IG5hbWVkLgotICAgICAqIEluIGFkZGl0aW9uLCBpdCBtYXkgYmUgaGFyZGx5IHJlY29nbml6YWJsZSB0byB0aGUgdXNlciwKLSAgICAgKiBwYXJ0aWN1bGFybHkgZm9yIERCLzIgY29uc3RyYWludHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCBiYWNraW5nCi0gICAgICogICAgICAgICB0aGlzIGZvcmVpZ24ga2V5IG1ldGFkYXRhIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoKXsKLSAgICAJcmV0dXJuIG1Gb3JlaWduS2V5OwotICAgIH0KLSAgICAvKioKLSAgICAgKiBBZGQgYW5vdGhlciBwYWlyIG9mIGZvcmVpZ24ga2V5IG1hcHBpbmdzIGZvciB0aGlzIGZvcmVpZ24ga2V5Ci0gICAgICogZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVmZXJyZXJDb2x1bW4gVGhlIHJlZmVycmVyIGNvbHVtbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZWRDb2x1bW4gVGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgZm9yIHRoaXMgbWFwcGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb2x1bW5NYXBwaW5nKFN0cmluZyByZWZlcnJlckNvbE5hbWUsIFN0cmluZyByZWZlcmVuY2VkQ29sTmFtZSkgewotICAgIAltUmVmZXJyZXJDb2xOYW1lcy5hZGQocmVmZXJyZXJDb2xOYW1lKTsKLSAgICAJbVJlZmVyZW5jZWRDb2xOYW1lcy5hZGQocmVmZXJlbmNlZENvbE5hbWUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcnJlciB0YWJsZSBuYW1lIG9mIHRoaXMgZm9yZWlnbiBrZXkKLSAgICAgKiByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJyZXIgY29sdW1uIG5hbWVzIGZvciB0aGlzCi0gICAgICogZm9yZWlnbiBrZXkuCi0gICAgICogVGhlIHNpemUgb2YgdGhpcyBsaXN0IGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiAKLSAgICAgKiB0aGUgbGlzdCByZXR1cmVkIGZyb20gPGNvZGU+Z2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1SZWZlcnJlckNvbE5hbWVzOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIHRhYmxlIG5hbWUgb2YgdGhpcyBmb3JlaWduIGtleQotICAgICAqIHJlbGF0aW9uc2hpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSB7Ci0gICAgCSByZXR1cm4gbVJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWVzIGZvciB0aGlzCi0gICAgICogZm9yZWlnbiBrZXkuCi0gICAgICogVGhlIHNpemUgb2YgdGhpcyBsaXN0IGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiAKLSAgICAgKiB0aGUgbGlzdCByZXR1cmVkIGZyb20gPGNvZGU+Z2V0UmVmZXJyZXJDb2x1bW5OYW1lczwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1SZWZlcmVuY2VkQ29sTmFtZXM7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgCXJldHVybiAibmFtZT0iICsgbU5hbWUKLQkJKyAiLCByZWZlcnJlclRhYmxlPSIgKyBtUmVmZXJyZXJUYWJsZU5hbWUKLQkJKyAiLCByZWZlcmVuY2VkVGFibGU9IiArIG1SZWZlcmVuY2VkVGFibGVOYW1lCi0JCSsgIiwgcmVmZXJyZXJDb2x1bW5zPSIgKyBtUmVmZXJyZXJDb2xOYW1lcwotCQkrICIsIHJlZmVyZW5jZWRDb2x1bW5zPSIgKyBtUmVmZXJlbmNlZENvbE5hbWVzCi0JCQk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvU3RyaW5nVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0NWUwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbAotewotCS8qKgotCSAqIFBhZHMgYSBzdHJpbmcgYnkgYWRkaW5nIGEgc2VxdWVuY2Ugb2YgYW4gYXJiaXRyYXJ5IGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nLgotCSAqIEBwYXJhbSBwYWRDaGFyIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgcGFkZGluZy4KLQkgKiBAcGFyYW0gbGVuIFRoZSBkZXNpcmVkIGxlbmd0aCBhZnRlciBwYWRkaW5nLgotCSAqIEByZXR1cm4gVGhlIHBhZGRlZCBzdHJpbmcuIEZvciBleGFtcGxlIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMgImY0ZSIgYW5kIDxjb2RlPnBhZENoYXI8L2NvZGU+IGlzICcwJyAKLQkgKiBhbmQgPGNvZGU+bGVuPC9jb2RlPiBpcyA2IHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyAiMDAwZjRlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZExlZnQoU3RyaW5nIHN0ciwgY2hhciBwYWRDaGFyLCBpbnQgbGVuKSB7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgc3RyTGVuID0gc3RyLmxlbmd0aCgpOwotCQlpZiAoc3RyTGVuIDwgbGVuKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCQkJaW50IGNvdW50ID0gbGVuLXN0ckxlbjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJCQlidWZmZXIuYXBwZW5kKHBhZENoYXIpOwotCQkJYnVmZmVyLmFwcGVuZChzdHIpOwotCQkJc3RyID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0cyBhIGdpdmVuIGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIEZvciBleGFtcGxlIGlmIHRoZSBzdHJpbmcgaXMgPHR0PmV4dHJlbWU8L3R0PiBhbmQgdGhlIGNoYXIgaXMgPHR0Pic8L3R0PiB0aGVuIAotCSAqIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgPHR0PidleHRlcm1lJzwvdHQ+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHIsIGNoYXIgYykgewotCQlhc3NlcnQoc3RyICE9IG51bGwpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCkrMik7Ci0JCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyKTsKLQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3VibGVRdW90ZShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBxdW90ZShzdHIsICciJyk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGZpcnN0IGFuZCBsYXN0IHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIChpZiB0aGV5IGV4aXN0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnF1b3RlKFN0cmluZyBxdW90ZWQpIHsKLQkJaWYgKHF1b3RlZCAhPSBudWxsICYmIHF1b3RlZC5sZW5ndGgoKSA+PSAyKXsKLQkJCWludCBsZW4gPSBxdW90ZWQubGVuZ3RoKCk7Ci0JCQljaGFyIGZpcnN0Q2hhciA9IHF1b3RlZC5jaGFyQXQoMCk7Ci0JCQljaGFyIGxhc3RDaGFyID0gcXVvdGVkLmNoYXJBdChsZW4tMSk7Ci0JCQlpZiAoZmlyc3RDaGFyID09IGxhc3RDaGFyICYmIChmaXJzdENoYXIgPT0gJ1wnJyB8fCBmaXJzdENoYXIgPT0gJyInKSkgewotCQkJCXJldHVybiBxdW90ZWQuc3Vic3RyaW5nKDEsIGxlbi0xKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcXVvdGVkOwotCX0KLQkvKioKLQkgKiBUcnVuY2F0ZXMgYSBzdHJpbmcgYW5kIGFkZHMgIi4uLiIgaW4gdGhlIHJlc3VsdCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBsZW5ndGggaXMgbGVzcyBvciBlcXVhbCB0byB0aGUgbWF4IGxlbiB0aGVuIAotCSAqIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGUoU3RyaW5nIHMsIGludCBtYXhMZW4pIHsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPiBtYXhMZW4pIHsKLQkJCWludCBzZWdtZW50TGVuID0gbWF4TGVuLzI7Ci0JCQlzID0gcy5zdWJzdHJpbmcoMCwgc2VnbWVudExlbikgKyAiLi4uIiArIHMuc3Vic3RyaW5nKGxlbi1zZWdtZW50TGVuKTsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzYW1lIGNoYXJhY3RlciByZXBlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBlYXQoY2hhciBjLCBpbnQgY291bnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY291bnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgdW5sZXNzIGl0IGlzIGVtdHB0eSB3aGVyZSBpdCByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbElmRW1wdHkoU3RyaW5nIHMpIHsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID09IDApIHsKLQkJCXMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNhbWUgY2hhcmFjdGVycyBhcyB0aGUgYXJndW1lbnQgc3RyaW5nIAotCSAqIGV4Y2VwdCB0aGF0IHRoZSBjb250cm9sIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IHRoZSB0aGVpciBoZXggY29kZS4KLQkgKiBGb3IgZXhhbXBsZSBpZiB0aGUgc3RyaW5nIGlzICJhYlxuYyIgdGhlIHJldHVybmVkIHN0cmluZyBpcyAiYWJ7MHhBfWMiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZpc2libGVTdHJpbmcoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA8PSAweDFGIHx8IChjID09IDB4MjAgJiYgKGkgPT0gMCB8fCBpID09IGxlbi0xKSkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCIoMHgiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWMpLnRvVXBwZXJDYXNlKCkgKyAiKSIpOwotCQkJfQotCQkJZWxzZSBidWZmZXIuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogUmVwbGFjZXMgYSBwb3J0aW9uIG9mIHN0cmluZy4KLQkgKiBAcGFyYW0gc3RyIFRoZSBvcmlnaW5hbCBzdHJpbmcuCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGluIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2hlcmUgdGhlIHJlcGxhY2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbiBUaGUgcmVwbGFjZSBsZW5ndGggdGhlIG9yaWdpbmFsIHN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlU3RyIFRoZSByZXBsYWNlbWVudCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlKFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBsZW4sIFN0cmluZyByZXBsYWNlU3RyKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKS1sZW4rcmVwbGFjZVN0ci5sZW5ndGgoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZygwLCBvZmZzZXQpKTsKLQkJYnVmZmVyLmFwcGVuZChyZXBsYWNlU3RyKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKG9mZnNldCtsZW4pKTsKLQkJCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyUmVwbGFjZShTdHJpbmcgc3RyLCBTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VTdHIpCi0JewotCQlpZihzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYocGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzKCIiKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlpbnQgaW5kZXggPSBzdHIuaW5kZXhPZihwYXR0ZXJuKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBzdHI7Ci0JCQotCQlpZiAocmVwbGFjZVN0ciA9PSBudWxsKQotCQkJcmVwbGFjZVN0ciA9ICIiOwotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyByZXBsYWNlU3RyICsgc3RyLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlQWxsKFN0cmluZyBzdHIsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZVN0cikKLQl7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocmVwbGFjZVN0ciA9PSBudWxsKQotCQkJcmVwbGFjZVN0ciA9ICIiOwotCQlpZihwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCWludCBpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4pOwotCQl3aGlsZSAoaW5kZXggPj0gMCkgewotCQkJc3RyID0gc3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyByZXBsYWNlU3RyICsgc3RyLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCQkJaW5kZXggPSBzdHIuaW5kZXhPZihwYXR0ZXJuLCBpbmRleCtyZXBsYWNlU3RyLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJJbnNlcnQoU3RyaW5nIHN0ciwgaW50IGluZGV4LCBTdHJpbmcgaW5zZXJ0U3RyKQotCXsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpCi0JCQkJKyBpbnNlcnRTdHIKLQkJCQkrIHN0ci5zdWJzdHJpbmcoaW5kZXgpOwotCX0KLSAgICAvKioKLSAgICAgKiBUb2tlbml6ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbnRvIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YKLSAgICAgKiB3b3Jkcy4KLSAgICAgKiBJZiB0aGUgc3RyaW5nIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSwgdGhpcwotICAgICAqIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgIFRoZSBzdHJpbmcgdG8gdG9rZW5pemUgaW50byBhIDxjb2RlPkxpc3Q8L2NvZGU+LgotICAgICAqIEBwYXJhbSBzZXAgICAgVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdG8gdXNlIHRvIHNwbGl0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgc3RyaW5nLgotICAgICAqIEBwYXJhbSB0cmltICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJ1biA8Y29kZT50cmltPC9jb2RlPiBvbgotICAgICAqICAgICAgICAgICAgICAgZWFjaCBlbGVtZW50IGluIHRoZSByZXN1bHQgPGNvZGU+TGlzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiBBIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgYWxsIHRva2VuaXplZCB3b3JkcwotICAgICAqICAgICAgICAgaW4gdGhlIHBhcmFtZXRlciBzdHJpbmcuCi0gICAgICogICAgICAgICBFYWNoIGVsZW1lbnQgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHN0clRvTGlzdChTdHJpbmcgcywgY2hhciBzZXAsIGJvb2xlYW4gdHJpbSkKLQl7Ci0JLy9leDogaWYgc2VwIGlzICc7JyB0aGVuIHMgc2hvdWxkIGJlIHNvbWV0aW5nIGxpa2UgIlJlZDtCbGFjayIKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCWNoYXIgZGVsaW1pdGVyc1tdID0ge3NlcH07Ci0JCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIocywgbmV3IFN0cmluZyhkZWxpbWl0ZXJzKSwgdHJ1ZS8qcmV0dXJuRGVsaW1pdGVycyovKTsKLQkJU3RyaW5nIGxhc3RUb2s9bnVsbDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2sgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmxlbmd0aCgpPT0xICYmIHRvay5jaGFyQXQoMCk9PXNlcCl7Ly9kZWxpbWl0ZXIKLQkJCSAgICBpZiAodG9rLmVxdWFscyhsYXN0VG9rKXx8bGFzdFRvaz09bnVsbC8qZmlyc3QgZWxlbWVudCBpcyBlbXB0eSovKQotCQkJICAgICAgICByZXN1bHQuYWRkKCIiKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkgICAgaWYgKHRyaW0pCi0JCQkgICAgICAgIHRvayA9IHRvay50cmltKCk7Ci0JCQkgICAgcmVzdWx0LmFkZCh0b2spOwotCQkJfQotCQkJbGFzdFRvaz10b2s7Ci0JCX0KLQkJaWYobGFzdFRvay5sZW5ndGgoKT09MSAmJiBsYXN0VG9rLmNoYXJBdCgwKT09c2VwKS8vbGFzdCBlbGVtZW50IGlzIGVtcHR5Ci0JCSAgICByZXN1bHQuYWRkKCIiKTsKLQkJcmVzdWx0LnRyaW1Ub1NpemUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gc3RyVG9MaXN0KFN0cmluZyBzLCBjaGFyIHNlcCkKLQl7Ci0JCXJldHVybiBzdHJUb0xpc3Qocywgc2VwLCBmYWxzZS8qdHJpbSovKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdFRvU3RyKENvbGxlY3Rpb24gYSwgY2hhciBzZXApCi0JewotCQlyZXR1cm4gbGlzdFRvU3RyKGEsIFN0cmluZy52YWx1ZU9mKHNlcCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0VG9TdHIoQ29sbGVjdGlvbjxPYmplY3Q+IGEsIFN0cmluZyBzZXApIHsKLQkJLy9yZXZlcnNlIG9mIHN0clRvTGlzdAotCQlpZiAoYSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjb3VudCA9IGEuc2l6ZSgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gYS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotCQl7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChzZXApOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpb2JqKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKG9iaik7Ci0JCX0KLQkJcmV0dXJuIChidWZmZXIgIT0gbnVsbCkgPyBidWZmZXIudG9TdHJpbmcoKSA6IG51bGw7Ci0JfQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHRleHQgb2YgYSBTdHJpbmcgaW50byBhIE1hcCBvZiBTdHJpbmdzLCB3aGVyZSBlYWNoCi0JICoga2V5IGFuZCB2YWx1ZSBpbiB0aGUgTWFwIGlzIG9mIHR5cGUgU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICogQHBhcmFtIHNlcDEgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5cyBhbmQgdGhlaXIKLQkgKiAgICAgICAgICAgICAgIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2VwMiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXktdmFsdWUgcGFpcnMuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBTdHJpbmc+IHN0clRvTWFwKFN0cmluZyBzLCBjaGFyIHNlcDEsIGNoYXIgc2VwMikKLQl7Ci0JCXJldHVybiBzdHJUb01hcChzLCBzZXAxLCBzZXAyLCBmYWxzZS8qbG93ZXJjYXNlS2V5cyovKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydCB0aGUgdGV4dCBvZiBhIFN0cmluZyBpbnRvIGEgTWFwIG9mIFN0cmluZ3MsIHdoZXJlIGVhY2gKLQkgKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBNYXAgaXMgb2YgdHlwZSBTdHJpbmcuCi0JICogVGhpcyBmb3JtIGFsc28gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoYXQgYWxsIGtleXMgd2lsbCBiZQotCSAqIGNvbnZlcnRlZCB0byBsb3dlci1jYXNlIGJlZm9yZSBhZGRpbmcgdG8gdGhlIE1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gcyAgICAgIFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGEgTWFwLgotCSAqIEBwYXJhbSBzZXAxICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleXMgYW5kIHRoZWlyCi0JICogICAgICAgICAgICAgICB2YWx1ZXMuCi0JICogQHBhcmFtIHNlcDIgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5LXZhbHVlIHBhaXJzLgotCSAqIEBwYXJhbSBsb3dlcmNhc2VLZXlzCi0JICogICAgICAgICAgICAgICBXaGV0aGVyIHRvIGNvbnZlcnQga2V5cyB0byBsb3dlciBjYXNlCi0JICogICAgICAgICAgICAgICBiZWZvcmUgYWRkaW5nIHRvIHRoZSBNYXAuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBTdHJpbmc+IHN0clRvTWFwKFN0cmluZyBzLCBjaGFyIHNlcDEsIGNoYXIgc2VwMiwgYm9vbGVhbiBsb3dlcmNhc2VLZXlzKQotCXsKLQkJLy9leDogaWYgc2VwMSBpcyAnOicgYW5kIHNlcDIgaXMgJywnIHRoZW4gcyBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgImNvbG9yOlJlZCxzaXplOlhMIgotCQkKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotCQl9Ci0JCQkKLQkJamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBhID0gc3RyVG9MaXN0KHMsIHNlcDIpOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLQkJfQotCQkKLQkJamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlpbnQgY291bnQgPSBhLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQl7Ci0JCQlTdHJpbmcgczIgPSAoU3RyaW5nKWEuZ2V0KGkpOyAvL2V4OiBjb2xvcjpSZWQKLQkJCWludCBwb3MgPSBzMi5pbmRleE9mKHNlcDEpOwotCQkJaWYgKHBvcyA+PSAwKQotCQkJewotCQkJCVN0cmluZyBuYW1lID0gczIuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQkJU3RyaW5nIHZhbCA9IHMyLnN1YnN0cmluZyhwb3MrMSk7Ci0JCQkJaWYgKGxvd2VyY2FzZUtleXMpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaG0ucHV0KG5hbWUsIHZhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhtOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXBUb1N0cihqYXZhLnV0aWwuTWFwIGhtLCBjaGFyIHNlcDEsIGNoYXIgc2VwMikKLQkvL3JldmVyc2Ugb2Ygc3RyVG9NYXAKLQl7Ci0JCWlmIChobSA9PSBudWxsIHx8IGhtLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yPGphdmEudXRpbC5NYXAuRW50cnk+IGl0ZXIgPSBobS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJamF2YS51dGlsLk1hcC5FbnRyeSBlbnRyeSA9IChqYXZhLnV0aWwuTWFwLkVudHJ5KWl0ZXIubmV4dCgpOwotCQkJYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKHNlcDEpOwotCQkJYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoc2VwMik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgPGVtPmNhc2UgaW5zZW5zaXRpdmU8L2VtPiBjb21wYXJpc29uIGJldHdlZW4KLSAgICAgKiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiB0d28gb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqMSAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS4KLSAgICAgKiBAcGFyYW0gb2JqMiAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIG9iamVjdHMgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgIHNhbWUgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVBc1N0cmluZ3MoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKQotCXsJCi0JCWlmIChvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsKQotCQkJcmV0dXJuIG9iajEgPT0gb2JqMjsKLQkJCi0JCVN0cmluZyBzMSwgczI7Ci0JCWlmIChvYmoxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlzMSA9IChTdHJpbmcpb2JqMTsKLSAgICAgICAgfSBlbHNlIHsKLQkJCXMxID0gb2JqMS50b1N0cmluZygpOwotICAgICAgICB9Ci0JCWlmIChvYmoyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlzMiA9IChTdHJpbmcpb2JqMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQkJCXMyID0gb2JqMi50b1N0cmluZygpOwotICAgICAgICB9Ci0JCQotCQlyZXR1cm4gczEuZXF1YWxzSWdub3JlQ2FzZShzMik7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgc3RhcnRzIHdpdGggYW55IG9mIGEgbGlzdCBvZiBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoQW55KFN0cmluZyBzLCBMaXN0PFN0cmluZz4gcHJlZml4ZXMpIHsKLQkJaW50IGNvdW50ID0gcHJlZml4ZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWlmIChzLnN0YXJ0c1dpdGgoKFN0cmluZylwcmVmaXhlcy5nZXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhciB1cHBlci1jYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRVcHBlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0ci5jaGFyQXQoMCkpICsgc3RyLnN1YnN0cmluZygxKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJndW1lbnQgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXIgbG93ZXItY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0TG93ZXIoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHIuY2hhckF0KDApKSArIHN0ci5zdWJzdHJpbmcoMSk7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyBhcmUgdXBwZXIKLQkgKiBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQ2FzZShTdHJpbmcgcykgewotCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpLmVxdWFscyhzKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3Qgbm9uLXdoaXRlIGNoYXIgaW5kZXggc3RhcnRpbmcgZnJvbSB0aGUgCi0JICogc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNraXBXaGl0ZVNwYWNlcyhTdHJpbmcgc3RyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJd2hpbGUgKGluZGV4IDwgbGVuKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK2luZGV4OwotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JLyoqCi0JICogQ29sbGFwc2VzIGNvbnNlY3V0aXZlIHdoaXRlIHNwYWNlcyBpbnRvIG9uZSBzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xsYXBzZVdoaXRlU3BhY2VzKFN0cmluZyBzdHIpewotCSAgICBTdHJpbmcgcmVzdWx0PW51bGw7Ci0JICAgIGlmIChzdHIhPW51bGwpewotCSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgICBib29sZWFuIGlzSW5XaGl0ZVNwYWNlPWZhbHNlOwotCSAgICAgICAgZm9yIChpbnQgaT0wO2k8c3RyLmxlbmd0aCgpO2krKyl7Ci0JICAgICAgICAgICAgY2hhciBjPXN0ci5jaGFyQXQoaSk7Ci0JICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpewotCSAgICAgICAgICAgICAgICBpc0luV2hpdGVTcGFjZT10cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAgICAgaWYgKGlzSW5XaGl0ZVNwYWNlKQotCSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOwotCSAgICAgICAgICAgICAgICBpc0luV2hpdGVTcGFjZT1mYWxzZTsgICAKLQkgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICByZXN1bHQ9YnVmZmVyLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2RzIHVzZWQgdG8gY29udmVydCBEQiBvYmplY3QgbmFtZXMgdG8gIAotCSAqIGFwcHJvcHJpYXRlIEphdmEgdHlwZSBhbmQgZmllbGQgbmFtZSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVyYWxpc2UoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5hbWU7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKLQkJCXJlc3VsdCArPSAncyc7Ci0JCX0gZWxzZSBpZiAoIXNlZW1zUGx1cmFsaXNlZChuYW1lKSkgewotCQkJU3RyaW5nIGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCFsb3dlci5lbmRzV2l0aCgiZGF0YSIpKSB7IC8vb3JkZXJEYXRhIC0tPiBvcmRlckRhdGFzIGlzIGR1bWIKLQkJCQljaGFyIHNlY29uZExhc3QgPSBsb3dlci5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJCWlmICghaXNWb3dlbChzZWNvbmRMYXN0KSAmJiBsb3dlci5lbmRzV2l0aCgieSIpKSB7Ci0JCQkJCS8vIGNpdHksIGJvZHkgZXRjIC0tPiBjaXRpZXMsIGJvZGllcwotCQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSkgKyAiaWVzIjsKLQkJCQl9IGVsc2UgaWYgKGxvd2VyLmVuZHNXaXRoKCJjaCIpIHx8IGxvd2VyLmVuZHNXaXRoKCJzIikpIHsKLQkJCQkJLy8gc3dpdGNoIC0tPiBzd2l0Y2hlcyAgb3IgYnVzIC0tPiBidXNlcwotCQkJCQlyZXN1bHQgPSBuYW1lICsgImVzIjsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBuYW1lICsgInMiOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpbmd1bGFyaXNlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuYW1lOwotCQlpZiAoc2VlbXNQbHVyYWxpc2VkKG5hbWUpKSB7Ci0JCQlTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAobG93ZXIuZW5kc1dpdGgoImllcyIpKSB7Ci0JCQkJLy8gY2l0aWVzIC0tPiBjaXR5Ci0JCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDMpICsgInkiOwotCQkJfSBlbHNlIGlmIChsb3dlci5lbmRzV2l0aCgiY2hlcyIpIHx8IGxvd2VyLmVuZHNXaXRoKCJzZXMiKSkgewotCQkJCS8vIHN3aXRjaGVzIC0tPiBzd2l0Y2ggb3IgYnVzZXMgLS0+IGJ1cwotCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJCX0gZWxzZSBpZiAobG93ZXIuZW5kc1dpdGgoInMiKSkgewotCQkJCS8vIGN1c3RvbWVycyAtLT4gY3VzdG9tZXIKLQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1Zvd2VsKGNoYXIgYykgewotCQlib29sZWFuIHZvd2VsID0gZmFsc2U7Ci0JCXZvd2VsIHw9IGMgPT0gJ2EnOwotCQl2b3dlbCB8PSBjID09ICdlJzsKLQkJdm93ZWwgfD0gYyA9PSAnaSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ28nOwotCQl2b3dlbCB8PSBjID09ICd1JzsKLQkJdm93ZWwgfD0gYyA9PSAneSc7Ci0JCXJldHVybiB2b3dlbDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZWVtc1BsdXJhbGlzZWQoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiBwbHVyYWxpc2VkID0gZmFsc2U7Ci0JCXBsdXJhbGlzZWQgfD0gbmFtZS5lbmRzV2l0aCgiZXMiKTsKLQkJcGx1cmFsaXNlZCB8PSBuYW1lLmVuZHNXaXRoKCJzIik7Ci0JCXBsdXJhbGlzZWQgJj0gIShuYW1lLmVuZHNXaXRoKCJzcyIpIHx8IG5hbWUuZW5kc1dpdGgoInVzIikpOwotCQlyZXR1cm4gcGx1cmFsaXNlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIG9mIGEgY2xhc3MgbmFtZS4KLQkgKiBGb3IgZXhhbXBsZSBpZiBnaXZlbiA8Y29kZT5vcmFjbGUudXRpbC5PYmplY3RVdGlsPC9jb2RlPiBpdCB3b3VsZCByZXR1cm4gCi0JICogPGNvZGU+b3JhY2xlLnV0aWw8L2NvZGU+LiBJZiB0aGUgY2xhc3MgaXMgbm90IGluIGEgcGFja2FnZSB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZihjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxhc3REb3RJbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdERvdEluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIGdpdmVuIGEgZnVsbCBjbGFzcyBuYW1lLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIDxjb2RlPm9yYWNsZS51dGlsLk9iamVjdFV0aWw8L2NvZGU+IGl0IHdvdWxkIHJldHVybiAKLQkgKiA8Y29kZT5PYmplY3RVdGlsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgZnVsbENsYXNzTmFtZSkgewotCQlpZihmdWxsQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBsYXN0RG90SW5kZXggPSBmdWxsQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0RG90SW5kZXggPCAwKQotCQkJcmV0dXJuIGZ1bGxDbGFzc05hbWU7Ci0JCXJldHVybiBmdWxsQ2xhc3NOYW1lLnN1YnN0cmluZyhsYXN0RG90SW5kZXgrMSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSBjb2x1bW4gbmFtZSB0byBhIEphdmEgdmFyaWFibGUgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5OYW1lVG9WYXJOYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXJldHVybiBkYk5hbWVUb1Zhck5hbWUoY29sdW1uTmFtZSk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgZGF0YWJhc2UgdGFibGUgbmFtZSB0byBhIEphdmEgdmFyaWFibGUgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZU5hbWVUb1Zhck5hbWUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZGJOYW1lVG9WYXJOYW1lKHRhYmxlTmFtZSk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgZGF0YWJhc2UgbmFtZSAodGFibGUgb3IgY29sdW1uKSB0byBhIGphdmEgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4gZW1wbG95ZWVfbmFtZSBvciBlbXBsb3llZS1uYW1lIC0+IGVtcGxveWVlTmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkYk5hbWVUb1Zhck5hbWUoU3RyaW5nIHMpIHsKLQkJaWYgKCIiLmVxdWFscyhzKSkgewotCQkJcmV0dXJuIHM7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlib29sZWFuIGNhcGl0YWxpemUgPSB0cnVlOwotCQlib29sZWFuIGxhc3RDYXBpdGFsID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGFzdERlY2FwaXRhbGl6ZWQgPSBmYWxzZTsKLQkJU3RyaW5nIHAgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJU3RyaW5nIGMgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7Ci0JCQlpZiAoIl8iLmVxdWFscyhjKSB8fCAiICIuZXF1YWxzKGMpKSB7Ci0JCQkJY2FwaXRhbGl6ZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChjLnRvVXBwZXJDYXNlKCkuZXF1YWxzKGMpKSB7Ci0JCQkJaWYgKGxhc3REZWNhcGl0YWxpemVkICYmICFsYXN0Q2FwaXRhbCkgewotCQkJCQljYXBpdGFsaXplID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJbGFzdENhcGl0YWwgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlsYXN0Q2FwaXRhbCA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAoY2FwaXRhbGl6ZSkgewotCQkJCWlmIChwID09IG51bGwgfHwgIXAuZXF1YWxzKCJfIikpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZChjLnRvVXBwZXJDYXNlKCkpOwotCQkJCQljYXBpdGFsaXplID0gZmFsc2U7Ci0JCQkJCXAgPSBjOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoYy50b0xvd2VyQ2FzZSgpKTsKLQkJCQkJY2FwaXRhbGl6ZSA9IGZhbHNlOwotCQkJCQlwID0gYzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoYy50b0xvd2VyQ2FzZSgpKTsKLQkJCQlsYXN0RGVjYXBpdGFsaXplZCA9IHRydWU7Ci0JCQkJcCA9IGM7Ci0JCQl9Ci0KLQkJfQotCQkvKnRoaXMgd2FzIHVzaW5nIFN0cmluZ1V0aWwuaW5pdExvd2VyLiBDaGFuZ2VkIHRvIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUgc28gdGhhdCAKLQkJICogaXQgcmV0dXJucyB0aGUgY29ycmVjdCBiZWFuIHByb3BlcnR5IG5hbWUgd2hlbiBjYWxsZWQgZnJvbSBjb2x1bW5OYW1lVG9WYXJOYW1lLgotCQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSBVUkwgd291bGQgYmUgdVJMIHdoaWNoIHdvdWxkIGNhdXNlIAotCQkgKiBhbiAiVGhlIHByb3BlcnR5IHVSTCBpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIHh4IiBlcnJvciBiZWNhdXNlIAotCQkgKiBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8gKHVzZWQgYnkgSmF2YVR5cGVJbnRyb3NwZWN0b3IpIHJldHVybnMgCi0JCSAqIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIFVSTC4qLwotCQlTdHJpbmcgcmVzdWx0U3RyID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCWlmIChyZXN1bHRTdHIuZXF1YWxzKCJjbGFzcyIpKSB7Ci0JCQkvLyAiY2xhc3MiIGlzIGlsbGVnYWwgYmVjYXVzZU9mIE9iamVjdC5nZXRDbGFzcygpIGNsYXNoCi0JCQlyZXN1bHRTdHIgPSAiY2xhenoiOwotCQl9Ci0JCXJldHVybiByZXN1bHRTdHI7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdHdvIG9iamVjdHMuIElmIGJvdGggU3RyaW5nLCBpZ25vcmUgY2FzZQotCSAqIEBwYXJhbSBvMQotCSAqIEBwYXJhbSBvMgotCSAqIEBwYXJhbSBpZ25vcmVDYXNlSWZTdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsT2JqZWN0cyhPYmplY3QgbzEsIE9iamVjdCBvMiwgYm9vbGVhbiBpZ25vcmVDYXNlSWZTdHIpCi0JewotCQlpZiAobzEgPT0gbzIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JICAgIGJvb2xlYW4gcmVzdWx0OwotCSAgICBpZiAobzEgPT0gbnVsbCB8fCBvMiA9PSBudWxsKSB7Ci0JICAgIAlyZXR1cm4gZmFsc2U7IC8vd2UgYWxyZWFkeSBjaGVja2VkIG8xID09IG8yIGFib3ZlCi0JICAgIH0KLQkgICAgaWYgKGlnbm9yZUNhc2VJZlN0ciAmJiBvMSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvMiBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgICAgIHJlc3VsdCA9ICgoU3RyaW5nKW8xKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpbzIpOwotCSAgICBlbHNlCi0JICAgICAgICByZXN1bHQgPSBvMS5lcXVhbHMobzIpOwotCQotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbE9iamVjdHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0JewotCSAgICByZXR1cm4gZXF1YWxPYmplY3RzKG8xLCBvMiwgZmFsc2UvKmlnbm9yZUNhc2VJZlN0ciovKTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9VcmxVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvVXJsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmVmOGY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9VcmxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29sbGVjdGlvbnMgb2YgdXRpbGl0eSBtZXRob2RzIGhhbmRsaW5nIFVSTHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVybFV0aWwKLXsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgZmlsZSBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGUiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBodHRwIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cCI7Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGh0dHAgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPVE9DT0wgPSAiaHR0cHMiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBmaWxlIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9QUk9UT0NPTCA9ICJqYXIiOwotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIGlzIHRvIGEgZmlsZSwgaS5lIGl0cyBwcm90b2NvbCBpcyA8Y29kZT5maWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlVXJsKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHVybCAhPSBudWxsICYmIEZJTEVfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIGlzIHRvIGEgamFyLCBpLmUgaXRzIHByb3RvY29sIGlzIDxjb2RlPmphcjwvY29kZT4uCi0JICogRm9yIGV4YW1wbGUgPGNvZGU+amFyOmZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phclVybChVUkwgdXJsKSB7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiBKQVJfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIHByb3RvY29sIGlzIGh0dHAuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cFVybChVUkwgdXJsKSB7Ci0JCVN0cmluZyBwcm90b2NvbCA9ICB1cmwuZ2V0UHJvdG9jb2woKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsICYmIChIVFRQX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkgfHwgSFRUUFNfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZpbGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gYSB1cmwsIG9yIG51bGwgaWYgdGhlIHVybCAKLQkgKiBwcm90b2NvbCBpcyBub3QgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXRVcmxGaWxlKFVSTCB1cmwpIHsKLQkJaWYgKGlzRmlsZVVybCh1cmwpICYmICFpc0phclVybCggdXJsICkgKXsKLQkJCUZpbGUgcmV0ID0gbmV3IGphdmEuaW8uRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCXJldHVybiByZXQgOwotCQl9Ci0JCXJldHVybiBudWxsOwotIAl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwgdG8gYSBqYXIgZmlsZSBnaXZlbiBhIHVybCB0byBhIGZpbGUgaW5zaWRlIAotCSAqIHRoZSBqYXIuCi0JICogRm9yIGV4YW1wbGUgaWYgZ2l2ZW4gCi0JICogPGNvZGU+amFyOmZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQ8L2NvZGU+Ci0JICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5maWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXI8L2NvZGU+LgotCSAqIAotCSAqIDxwPlJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gdXJsIGlzIG5vdCByZWNvZ25pemVkIGFzIGEgdXJsIHRvIGEgZmlsZSAKLQkgKiBpbnNpZGUgYSBqYXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SmFyRmlsZVVybChVUkwgdXJsKSB7Ci0JCWlmICghaXNKYXJVcmwodXJsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOyAvL2ZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQKLQkJaW50IGluZGV4ID0gZmlsZS5pbmRleE9mKCchJyk7Ci0JCWlmIChpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBqYXJGaWxlVXJsU3RyID0gZmlsZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoamFyRmlsZVVybFN0cik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW1vdGUoU3RyaW5nIHVybCl7Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aCgiaHR0cDoiKXx8dXJsLnN0YXJ0c1dpdGgoImh0dHBzOiIpfHx1cmwuc3RhcnRzV2l0aCgid3d3LiIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVtcGxhdGVGb2xkZXIoU3RyaW5nIHBsdWdJZCAsIFN0cmluZyBzdHJQYXRoICl7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHBsdWdJZCApOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aCggc3RyUGF0aCApOwotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQl0cnkgewotCQkJVVJMIHRlbXBsVXJsOwotCQkJdGVtcGxVcmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQlGaWxlIHRlbXBsRGlyID0gVXJsVXRpbC5nZXRVcmxGaWxlKHRlbXBsVXJsKTsKLQkJCXJldHVybiB0ZW1wbERpciA7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvY29sdW1uLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvY29sdW1uLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmMTNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2NvbHVtbi52bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQENvbHVtbiBhbm5vdGF0aW9uLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgImNvbHVtbiIgYW5kIGEgInRhYmxlIiBvYmplY3QKLSMjZ2VuZXJhdGUgYW5ub3RhdGlvbiBvbmx5IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29sdW1uIE5PVCBkZWZhdWx0Ci0jI2FuZCB0aGUgZ2VuZXJhdGVETExBbm5vdGF0aW9uIHByb3BlcnR5IGlzIG5vdCBzZXQgb24gdGhlIHRhYmxlCi0jIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNtYWNybyggYXBwZW5kICRtZW1iZXJzICRwYXJhbWV0ZXJzICkKLSNpZiggJG1lbWJlcnMgPT0gIiIpCi0jc2V0KCAkbWVtYmVycyA9ICRwYXJhbWV0ZXJzICkKLSNlbHNlCi0jc2V0KCAkbWVtYmVycyA9ICIkbWVtYmVycywgJHBhcmFtZXRlcnMiICkgCi0jZW5kCQotI2VuZAotIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgKCAkY29sdW1uLmRhdGFUeXBlTE9CKQotICAgIEBMb2IoKQotI2VuZAotI2lmICggJGNvbHVtbi5uZWVkTWFwVGVtcG9yYWxUeXBlKQotICAgIEBUZW1wb3JhbCggVGVtcG9yYWxUeXBlLiRjb2x1bW4udGVtcG9yYWxUeXBlKQotI2VuZAotI3NldCAoJG1lbWJlcnMgPSAiIikKLSNpZiAoICEkY29sdW1uLmRlZmF1bHQgfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucyApCi0jaWYgKCAhJHtjb2x1bW4uZGVmYXVsdG5hbWV9ICkKLSNhcHBlbmQoJG1lbWJlcnMgIm5hbWU9JGN1c3RvbWl6ZXIucXVvdGUoJGNvbHVtbi5uYW1lKSIgKQotI2VuZAotI2lmICghJGNvbHVtbi5pbnNlcnRhYmxlKQotI2FwcGVuZCgke21lbWJlcnN9ICJpbnNlcnRhYmxlPWZhbHNlIikKLSNlbmQKLSNpZiAoISRjb2x1bW4udXBkYXRlYWJsZSkKLSNhcHBlbmQoJHttZW1iZXJzfSAidXBkYXRhYmxlPWZhbHNlIikKLSNlbmQKLSNlbmQKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucyApCi0jaWYgKCRjb2x1bW4udW5pcXVlKQotI2FwcGVuZCgkbWVtYmVycyAgInVuaXF1ZT10cnVlIikKLSNlbmQKLSNpZiAoISRjb2x1bW4ubnVsbGFibGUpCi0jYXBwZW5kKCRtZW1iZXJzICAibnVsbGFibGU9ZmFsc2UiKQotI2VuZAotI2lmICgkY29sdW1uLnNpemUgPiAwKQotI2lmICgkY29sdW1uLm51bWVyaWMpCi0jYXBwZW5kKCRtZW1iZXJzICJwcmVjaXNpb249JGNvbHVtbi5zaXplIikKLSNpZiAoJGNvbHVtbi5kZWNpbWFsRGlnaXRzICE9IDAgJiYgJGNvbHVtbi5kZWNpbWFsRGlnaXRzICE9IC0xKQotI2FwcGVuZCgkbWVtYmVycyAic2NhbGU9JGNvbHVtbi5kZWNpbWFsRGlnaXRzIikKLSNlbmQKLSNlbHNlCi0jaWYgKCAhJGNvbHVtbi5kYXRhVHlwZUxPQikKLSNhcHBlbmQoJG1lbWJlcnMgImxlbmd0aD0kY29sdW1uLnNpemUiKQotI2VuZAotI2VuZAotI2VuZAotI2VuZAotI2lmKCAkbWVtYmVycyAhPSIiICkKLQlAQ29sdW1uKCRtZW1iZXJzKQotI2VuZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvam9pbi52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzliMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvam9pbi52bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQEpvaW5UYWJsZSwgQEpvaW5Db2x1bW4gb3IgQEpvaW5Db2x1bW5zIGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSMjbWFjcm8gam9pbkNvbHVtbiB1c2VzICRjb2x1bW4sICRyZWZlcmVuY2VkQ29sdW1uCi0jbWFjcm8gKGpvaW5Db2x1bW4gJGNvbHVtbiAkcmVmZXJlbmNlZENvbHVtbikKLSNzZXQgKCRtZW1iZXJzID0gIm5hbWU9JGN1c3RvbWl6ZXIucXVvdGUoJGNvbHVtbi5qb2luQ29sdW1uTmFtZSkiKQotI2lmKCAhJHJlZmVyZW5jZWRDb2x1bW4ucHJpbWFyeUtleSB8fCAkcmVmZXJlbmNlZENvbHVtbi5wYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5ICkKLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0kY3VzdG9taXplci5xdW90ZSgkcmVmZXJlbmNlZENvbHVtbi5uYW1lKSIpCi0jZW5kCi0jaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQotI2lmICgkY29sdW1uLnVuaXF1ZSAmJiAhJGNvbHVtbi5wcmltYXJ5S2V5KQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIHVuaXF1ZT10cnVlIikKLSNlbmQKLSNpZiAoISRjb2x1bW4ubnVsbGFibGUpCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgbnVsbGFibGU9ZmFsc2UiKQotI2VuZAotI2VuZAotI2lmICgkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICYmICEkcm9sZS5hc3NvY2lhdGlvbi5qb2luVGFibGUgJiYgISRyb2xlLnJlZmVycmVyVGFibGUuaXNDb2x1bW5VcGRhdGVJbnNlcnQoJHJvbGUsICRjb2x1bW4pKQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSIpCi0jZW5kCi1ASm9pbkNvbHVtbigkbWVtYmVycykjZW5kCi0jIwotIyMKLSMjCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSkKLSNzZXQgKCRqb2luVGFibGUgPSAkcm9sZS5hc3NvY2lhdGlvbi5qb2luVGFibGUpCi0JQEpvaW5UYWJsZSgKLQkJbmFtZT0iJHtqb2luVGFibGUuam9pblRhYmxlQW5ub3RhdGlvbk5hbWV9IgotCQksIGpvaW5Db2x1bW5zPXsKLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVycmVyQ29sdW1ucykKLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpCi0jIyRyZWZlcmVuY2VkQ29sdW1uIGlzIHRoZSBjb2x1bW4gaW4gdGhlIGpvaW4gdGFibGUKLQkJCSNqb2luQ29sdW1uKCRyZWZlcmVuY2VkQ29sdW1uICRjb2x1bW4pCi0jaWYgKCR2ZWxvY2l0eUNvdW50IDwgJHJvbGUucmVmZXJyZXJDb2x1bW5zLnNpemUoKSApCi0sCi0jZW5kCQkJCi0jZW5kCi0KLQkJCX0KLQkJLCBpbnZlcnNlSm9pbkNvbHVtbnM9ewotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHJvbGUucmVmZXJlbmNlZENvbHVtbnMpCi0jc2V0ICgkcmVmZXJlbmNlZENvbHVtbiA9ICRyb2xlLmdldFJlZmVycmVyQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkKLSMjJHJlZmVyZW5jZWRDb2x1bW4gaXMgdGhlIGNvbHVtbiBpbiB0aGUgam9pbiB0YWJsZQotCQkJI2pvaW5Db2x1bW4oJHJlZmVyZW5jZWRDb2x1bW4gJGNvbHVtbikKLSNpZiAoJHZlbG9jaXR5Q291bnQgPCAkcm9sZS5yZWZlcmVuY2VkQ29sdW1ucy5zaXplKCkgKQotLAotI2VuZAkJCQotI2VuZAotCi0JCQl9Ci0JCSkKLSNlbHNlCi0jaWYgKCRyb2xlLnJlZmVycmVyQ29sdW1ucy5zaXplKCkgPT0gMSkKLSNzZXQgKCRjb2x1bW4gPSAkcm9sZS5yZWZlcnJlckNvbHVtbnMuZ2V0KDApKQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkKLSNzZXQgKCRyZWZlcmVuY2VkVGFibGVOYW1lID0gJHJvbGUuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpICkKLSNzZXQoICRyZWZlcmVuY2VkVGFibGVQa05hbWUgPSAkcm9sZS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkubmFtZSApCi0jc2V0KCAkY29tcHV0ZWRKb2luQ29sdW1uTmFtZSA9ICIke3JvbGUucHJvcGVydHlOYW1lfV8ke3JlZmVyZW5jZWRUYWJsZVBrTmFtZX0iICkKLSNpZigkY29sdW1uLm5hbWUudG9VcHBlckNhc2UoKSAhPSAkY29tcHV0ZWRKb2luQ29sdW1uTmFtZS50b1VwcGVyQ2FzZSgpICkKLQkjam9pbkNvbHVtbigkY29sdW1uICRyZWZlcmVuY2VkQ29sdW1uKQotCi0jZWxzZWlmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkKLQkjam9pbkNvbHVtbigkY29sdW1uICRyZWZlcmVuY2VkQ29sdW1uKQotCi0jZW5kCi0jZWxzZQotCUBKb2luQ29sdW1ucyh7Ci0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkcm9sZS5yZWZlcnJlckNvbHVtbnMpCi0jc2V0ICgkcmVmZXJlbmNlZENvbHVtbiA9ICRyb2xlLmdldFJlZmVyZW5jZWRDb2x1bW4oJHtjb2x1bW4ubmFtZX0pKQotCQkjam9pbkNvbHVtbigkY29sdW1uICRyZWZlcmVuY2VkQ29sdW1uKQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5zaXplKCkgKQotLAotI2Vsc2UKLQotI2VuZAotI2VuZAkJCi0JCX0pCi0jZW5kCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwYTc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21haW4uamF2YS52bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jaWYgKCR0YWJsZS5wYWNrYWdlICE9ICIiKQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9OwotI2VuZAotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKLSR7dGFibGUuaW1wb3J0U3RhdGVtZW50c30KLQotLyoqCi0gKiBUaGUgcGVyc2lzdGVudCBjbGFzcyBmb3IgdGhlICR7dGFibGUubmFtZX0gZGF0YWJhc2UgdGFibGUuCi0gKiAKLSAqLwotQEVudGl0eQotI2lmKCAhJHt0YWJsZS5kZWZhdWx0bmFtZX0gfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucykKLUBUYWJsZShuYW1lPSIke3RhYmxlLm5hbWV9IikKLSNlbmQKLXB1YmxpYyBjbGFzcyAke3RhYmxlLmNsYXNzTmFtZX0gJHt0YWJsZS5nZW5lcmF0ZUV4dGVuZHNJbXBsZW1lbnRzKCl9IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSMjIyMjCi0jIyMjIyBmaWVsZHMKLSMjIyMjCi0jaWYgKCR0YWJsZS5jb21wb3NpdGVLZXkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikKLQotCUBFbWJlZGRlZElkCi0jZW5kCi0JcHJpdmF0ZSAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9OwotI2VuZAotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLmdldFNpbXBsZUNvbHVtbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKQotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpCi0KLSNwYXJzZSgibWFwcGluZ0tpbmQudm0iKQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSR7Y29sdW1uLmZpZWxkU2NvcGV9ICR7Y29sdW1uLnNpbXBsZVByb3BlcnR5VHlwZX0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLSNlbmQKLSNmb3JlYWNoICgkcm9sZSBpbiAkdGFibGUuYXNzb2NpYXRpb25Sb2xlcykKLSMjIyMjCi0jIyMjIyBmaWVsZCBhbm5vdGF0aW9ucwotIyMjIyMKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQotCi0JLy8ke3JvbGUuZGVzY3JpcHRpb259Ci0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIpCi0jcGFyc2UoIm1hbnlUb09uZS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1tYW55IikKLSNwYXJzZSgibWFueVRvTWFueS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW1hbnkiKQotI3BhcnNlKCJvbmVUb01hbnkudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQotI3BhcnNlKCJvbmVUb09uZS52bSIpCi0jZW5kCi0jZW5kCi0jIyMjIwotIyMjIyMgZmllbGQgZGVjbGFyYXRpb24KLSMjIyMjCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQotI3NldCAoJHByb3BlcnR5VHlwZSA9ICR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfSkKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gIiR7cm9sZS5yZWZlcmVuY2VkVGFibGUuc2ltcGxlQ29sbGVjdGlvblR5cGV9PCR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfT4iKQotI2VuZAotCXByaXZhdGUgJHByb3BlcnR5VHlwZSAkcm9sZS5wcm9wZXJ0eU5hbWU7Ci0jZW5kCi0KLSAgICBwdWJsaWMgJHt0YWJsZS5jbGFzc05hbWV9KCkgewotICAgIH0KLQotIyMjIyMKLSMjIyMjIHNpbXBsZSBwcm9wZXJ0aWVzIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jaWYgKCR0YWJsZS5jb21wb3NpdGVLZXkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotCUBFbWJlZGRlZElkCi0jZW5kCi0JcHVibGljICR0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWUgJGN1c3RvbWl6ZXIucHJvcGVydHlHZXR0ZXIoJHRhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCAkY3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkdGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lKSgkdGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lICR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcy4ke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX0gPSAke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX07Ci0JfQotCQotI2VuZAotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLmdldFNpbXBsZUNvbHVtbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKQotI2lmICgkdGFibGUuYWNjZXNzID09ICJwcm9wZXJ0eSIpCi0KLSNwYXJzZSgibWFwcGluZ0tpbmQudm0iKQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSRjb2x1bW4ucHJvcGVydHlHZXRTY29wZSAkY29sdW1uLnNpbXBsZVByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCi0JJGNvbHVtbi5wcm9wZXJ0eVNldFNjb3BlIHZvaWQgJGN1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCRjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlICRjb2x1bW4ucHJvcGVydHlOYW1lKSB7Ci0JCXRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfSA9ICR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCi0jZW5kCi0jIyMjIwotIyMjIyMgYXNzb2NpYXRpb25zIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jZm9yZWFjaCAoJHJvbGUgaW4gJHRhYmxlLmFzc29jaWF0aW9uUm9sZXMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotCS8vJHtyb2xlLmRlc2NyaXB0aW9ufQotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiKQotI3BhcnNlKCJtYW55VG9PbmUudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIpCi0jcGFyc2UoIm1hbnlUb01hbnkudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikKLSNwYXJzZSgib25lVG9NYW55LnZtIikKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikKLSNwYXJzZSgib25lVG9PbmUudm0iKQotI2VuZAotI2VuZAotIyMKLSNpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tb25lIiB8fCAkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW9uZSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gJHJvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZSkKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gIiR7cm9sZS5yZWZlcmVuY2VkVGFibGUuc2ltcGxlQ29sbGVjdGlvblR5cGV9PCR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfT4iKQotI2VuZAotCXB1YmxpYyAkcHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRyb2xlLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7cm9sZS5wcm9wZXJ0eU5hbWV9OwotCX0KLQotCXB1YmxpYyB2b2lkICR7Y3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkcm9sZS5wcm9wZXJ0eU5hbWUpfSgkcHJvcGVydHlUeXBlICRyb2xlLnByb3BlcnR5TmFtZSkgewotCQl0aGlzLiR7cm9sZS5wcm9wZXJ0eU5hbWV9ID0gJHJvbGUucHJvcGVydHlOYW1lOwotCX0KLQkKLSMjCi0jZW5kCi0jIwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9NYW55LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDgyYWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9NYW55IGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCAmJiAhJHJvbGUuaXNSZWZlcnJlclJvbGUoKSkjI3RoZSBvd25pbmcgc2lkZSAoZWl0aGVyIHNpZGUgZm9yIG1hbnktdG8tbWFueSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkxBWlkiKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQotI2VuZAotI2lmKCRtZW1iZXJzIT0iIikKLQlATWFueVRvTWFueSgkbWVtYmVycykKLSNlbHNlCQotICAgIEBNYW55VG9NYW55Ci0jZW5kICAgIAotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuTEFaWSIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBNYW55VG9NYW55KCRtZW1iZXJzKQotI2Vsc2UJCi0gICAgQE1hbnlUb01hbnkKLSNlbmQgICAgCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNzliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9PbmUgYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlCi0jIwotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9ICIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0gIkZldGNoVHlwZS5FQUdFUiIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBNYW55VG9PbmUoJG1lbWJlcnMpCi0jZWxzZQotICAgIEBNYW55VG9PbmUKLSNlbmQKLSNwYXJzZSgiam9pbi52bSIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFwcGluZ0tpbmQudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZDA1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQEJhc2ljLCBASWQsIEBWZXJzaW9uIGFubm90YXRpb25zLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgImNvbHVtbiIgb2JqZWN0Ci0jIwotI3NldCAoJG1hcHBpbmdLaW5kID0gJGNvbHVtbi5tYXBwaW5nS2luZCkKLSNpZiAoJG1hcHBpbmdLaW5kID09ICJpZCIpCi0JQElkCi0jc2V0ICgkaWRHZW5lcmF0b3IgPSAkdGFibGUuaWRHZW5lcmF0b3IpCi0jaWYgKCRpZEdlbmVyYXRvciA9PSAiYXV0byIpCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiR2VuZXJhdGlvblR5cGUuQVVUTyIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gImlkZW50aXR5IikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5JREVOVElUWSIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gInNlcXVlbmNlIikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gInRhYmxlIikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5UQUJMRSIpCi0jZWxzZQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIiIpCi0jZW5kCi0jaWYgKCRpZEdlbmVyYXRvciA9PSAic2VxdWVuY2UiICkKLSNzZXQgKCRnZW5lcmF0b3JOYW1lID0gIiR7dGFibGUubmFtZS50b1VwcGVyQ2FzZSgpfV8ke2NvbHVtbi5wcm9wZXJ0eU5hbWUudG9VcHBlckNhc2UoKX1fR0VORVJBVE9SIikKLSNpZiggJHRhYmxlLmZvcm1hdHRlZFNlcXVlbmNlICE9ICIiICkKLQlAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iJGdlbmVyYXRvck5hbWUiLCBzZXF1ZW5jZU5hbWU9IiR0YWJsZS5mb3JtYXR0ZWRTZXF1ZW5jZSIpCi0jZWxzZQotCUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSIkZ2VuZXJhdG9yTmFtZSIgKQotI2VuZAkKLQlAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9JGdlbmVyYXRpb25UeXBlLCBnZW5lcmF0b3I9IiRnZW5lcmF0b3JOYW1lIikKLSNlbHNlaWYgKCRnZW5lcmF0aW9uVHlwZSAhPSAiIikKLQlAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9JGdlbmVyYXRpb25UeXBlKQotI2VuZCAgICAgIAotI2Vsc2VpZiAoJG1hcHBpbmdLaW5kID09ICJ2ZXJzaW9uIikKLQlAVmVyc2lvbgotI2Vsc2UKLSMjREVGQVVMVCBpcyBAQmFzaWMsIG5vIG5lZWQgdG8gZ2VuZXJhdGUKLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjE1Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9NYW55LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBAT25lVG9NYW55IGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpICE9IkZldGNoVHlwZS5MQVpZIikKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLQlAT25lVG9NYW55KCRtZW1iZXJzKQotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkgIT0iRmV0Y2hUeXBlLkxBWlkiKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQotI2VuZAotCUBPbmVUb01hbnkoJG1lbWJlcnMpCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvT25lLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDc1MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBPbmVUb09uZSBhbm5vdGF0aW9uLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUKLSMjCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmJpZGlyZWN0aW9uYWwgJiYgISRyb2xlLmlzUmVmZXJyZXJSb2xlKCkpIyN0aGUgb3duaW5nIHNpZGUgKGVpdGhlciBzaWRlIGZvciBvbmUtdG8tb25lKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0JQE9uZVRvT25lKCRtZW1iZXJzKQotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBPbmVUb09uZSgkbWVtYmVycykKLSNlbHNlCi0JQE9uZVRvT25lCi0jZW5kCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9way5qYXZhLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODMxMDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jaWYgKCR0YWJsZS5wYWNrYWdlICE9ICIiKQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9OwotI2VuZAotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKLQotLyoqCi0gKiBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgZm9yIHRoZSAke3RhYmxlLm5hbWV9IGRhdGFiYXNlIHRhYmxlLgotICogCi0gKi8KLUBFbWJlZGRhYmxlCi1wdWJsaWMgY2xhc3MgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkvL2RlZmF1bHQgc2VyaWFsIHZlcnNpb24gaWQsIHJlcXVpcmVkIGZvciBzZXJpYWxpemFibGUgY2xhc3Nlcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSMjIyMjCi0jIyMjIyBmaWVsZHMKLSMjIyMjCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikKLQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSR7Y29sdW1uLmZpZWxkU2NvcGV9ICR7Y29sdW1uLnByb3BlcnR5VHlwZX0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLSNlbmQKLQotICAgIHB1YmxpYyAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0oKSB7Ci0gICAgfQotIyMjIyMKLSMjIyMjIHNpbXBsZSBwcm9wZXJ0aWVzIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSRjb2x1bW4ucHJvcGVydHlHZXRTY29wZSAkY29sdW1uLnByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCSRjb2x1bW4ucHJvcGVydHlTZXRTY29wZSB2b2lkICRjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgkY29sdW1uLnByb3BlcnR5VHlwZSAkY29sdW1uLnByb3BlcnR5TmFtZSkgewotCQl0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX0gPSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9OwotCX0KLSNlbmQKLSMjCi0jIyBlcXVhbHMvaGFzaENvZGUKLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCSR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSBjYXN0T3RoZXIgPSAoJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9KW90aGVyOwotCQlyZXR1cm4gCi0JCQkke3RhYmxlLnByaW1hcnlLZXlFcXVhbHNDbGF1c2V9Ci0KLSAgICB9Ci0gICAgCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCBoYXNoID0gMTc7Ci0JCSR7dGFibGUucHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlfQotCQlyZXR1cm4gaGFzaDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzJjODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVjYjNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDRkNGY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBNYXIgMDkgMTA6Mzk6NTggRVNUIDIwMTAKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS42Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E1ZmI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM0YTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlN2RmY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQgLSBTY2hlbWEgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc2YjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1wIHBhY2thZ2VOYW1lXSAtIHNwZWNpZmllcyB0aGUgc291cmNlIHBhY2thZ2UgCi0gKiAKLSAqICBSZXF1aXJlZCBKUkUgMS42IGFuZCBlY2xpcHNlbGluay5qYXIgdG8gcnVuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc291cmNlUGFja2FnZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBOT19GQUNUT1JZX0NMQVNTID0gImRvZXNudCBjb250YWluIE9iamVjdEZhY3RvcnkuY2xhc3MiOyAgIC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE1haW4oKS5leGVjdXRlKGFyZ3MpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCQotCQl0aGlzLmluaXRpYWxpemVXaXRoKGFyZ3MpOwotCQkKLQkJdGhpcy5nZW5lcmF0ZSgpOwotCX0KLQkJCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UodGhpcy5zb3VyY2VQYWNrYWdlTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmKG1lc3NhZ2UuaW5kZXhPZihOT19GQUNUT1JZX0NMQVNTKSA+IC0xKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5TY2hlbWEgIiArIHRoaXMudGFyZ2V0U2NoZW1hTmFtZSArICIgbm90IGNyZWF0ZWQiKTsKLQkJCXJldHVybjsKLQkJfQotICAgICAgICAvLyBHZW5lcmF0ZSBhbiBYTUwgU2NoZW1hCi0JCVNjaGVtYU91dHB1dFJlc29sdmVyIHNjaGVtYU91dHB1dFJlc29sdmVyID0gCi0JCQluZXcgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIodGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLQkJCi0JCXRyeSB7Ci0JCQlqYXhiQ29udGV4dC5nZW5lcmF0ZVNjaGVtYShzY2hlbWFPdXRwdXRSZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJcblNjaGVtYSAiICsgdGhpcy50YXJnZXRTY2hlbWFOYW1lICsgIiBnZW5lcmF0ZWQiKTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaXRoKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAJdGhpcy5zb3VyY2VQYWNrYWdlTmFtZSA9IHRoaXMuZ2V0U291cmNlUGFja2FnZU5hbWUoYXJncyk7Ci0gICAgCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRoaXMuZ2V0VGFyZ2V0U2NoZW1hTmFtZShhcmdzKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VQYWNrYWdlTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXAiLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0U2NoZW1hTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXMiLCBhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50VmFsdWUoU3RyaW5nIGFyZ3VtZW50LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ3VtZW50KSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi1jbGFzcyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlciBleHRlbmRzIFNjaGVtYU91dHB1dFJlc29sdmVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0YXJnZXRTY2hlbWFOYW1lOwotCQotCXByb3RlY3RlZCBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcihTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZSkgewotCQl0aGlzLnRhcmdldFNjaGVtYU5hbWUgPSB0YXJnZXRTY2hlbWFOYW1lOwotCX0KLQkKLQkgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3VsdCBjcmVhdGVPdXRwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMudGFyZ2V0U2NoZW1hTmFtZSApOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlKTsKLSAgICAgICAgcmVzdWx0LnNldFN5c3RlbUlkKGZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0ZDY0My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvcmUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjY1NjFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNDRhYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6MjY6MzIgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZDU0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDI5ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4zLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuRXh0ZW5zaW9uVGVzdFBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC51aSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzIgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTNmNDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3OTU2Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRXh0ZW5zaW9uIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDJlZmY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm1zIj4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCQkJaWQ9ImNvcmUudGVzdEpwYVBsYXRmb3JtIgotCQkJbGFiZWw9IlRlc3QgSnBhIFBsYXRmb3JtIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtRmFjdG9yeSIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm1VaXMiPgotCQkKLQkJPGpwYVBsYXRmb3JtVWkKLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybS51aSIKLQkJCWpwYVBsYXRmb3JtPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmZjk5My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEV4dGVuc2lvblRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpb25UZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTQzOWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9BTk5PVEFUSU9OX05BTUUgPSAidGVzdC5UZXN0QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0NDBiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBmOGM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdFR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19LRVkgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0VHlwZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZURiSW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTk2ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0VHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFlZjBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmcKLXsKLQlwdWJsaWMgVGVzdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhRW50aXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkYmI3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RKYXZhRW50aXR5Ci17Ci0JcHJvdGVjdGVkIFRlc3RKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4Y2EzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU4ZTEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybUZhY3RvcnkuU2ltcGxlVmVyc2lvbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1GYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFRlc3RKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgVGVzdEpwYUZhY3RvcnkoKSwgCi0JCQluZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcihHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKSwgCi0JCQlUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMV8wKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCQlyZXR1cm4gIkJPT09ZQUghIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5NQVlCRTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmI3M2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvcmUudGVzdEpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLQkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCi0JCXJldHVybiBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07ICAvLyBhZGRlZAotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAodG9wbGluaykgdXNlcwotCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCi0JCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07IC8vIGFkZGVkCi0JfQotCQotCS8vICoqKioqKioqKiogTWFwcGluZyBGaWxlcyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc291cmNlRGVmaW5pdGlvbltdIGJ1aWxkUmVzb3VyY2VEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCQlHZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjBkZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCi0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGQ5MWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjAxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNkMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMToxMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjlkNTQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1OToxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyNTU5ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwuSnB0RGJUZXN0c1BsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWw7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMGQwMTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmQxNTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsIGZvciBEZXJieQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L2RlcmJ5L2xpYi9kZXJieS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQgZm9yIERlcmJ5Ci0jIHVybCA9IGpkYmM6ZGVyYnk6QzovZGVyYnkvZGF0YS90ZXN0ZGI7Y3JlYXRlPXRydWUKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDA3ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4wLjYtYmluLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyBvcHRpb25hbCBmb3IgTXlTUUwKLSMgdXJsID0gamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdjMDFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpYRQotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MTFiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmYWZlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3Bvc3RncmVzcWwvamRiYy9wb3N0Z3Jlc3FsLTguMi01MDUuamRiYzMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIG9wdGlvbmFsIGZvciBQb3N0Z3JlU1FMCi0jIHVybCA9IGpkYmM6cG9zdGdyZXNxbApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyYjY0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3Fsc2VydmVyL2xpYi9zcWxqZGJjLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnNxbHNlcnZlcjovL2xvY2FsaG9zdDoxNDMzCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3N5YmFzZS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2Q1ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3N5YmFzZS9saWIvamNvbm4zLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNGZlMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKUEEgREIgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwNWQ3Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGhlc2UgYXJlbid0IHRlc3RzLiBUaGV5IGFyZSBqdXN0IGFuIGVhc3kgd2F5IHRvIGR1bXAgSkRCQyBtZXRhZGF0YSB0byB0aGUKLSAqIGNvbnNvbGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKREJDVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlcmJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKERFUkJZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXlTUUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoTVlTUUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmFjbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoT1JBQ0xFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdGdyZVNRTCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShQT1NUR1JFU1FMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3liYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKFNZQkFTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE1ldGFEYXRhKENvbm5lY3Rpb25Db25maWcgY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiBQTEFURk9STTogIiArIGNvbmZpZy5wbGF0Zm9ybU5hbWUgKyAiICoqKioqIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlDbGFzcy5mb3JOYW1lKGNvbmZpZy5kcml2ZXJDbGFzc05hbWUpOwotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odGhpcy5idWlsZFVSTChjb25maWcpLCBjb25maWcudXNlciwgY29uZmlnLnBhc3N3b3JkKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDQVRBTE9HUzoiKTsKLQkJSkRCQ1Rvb2xzLmR1bXAoY29ubmVjdGlvbi5nZXRNZXRhRGF0YSgpLmdldENhdGFsb2dzKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTQ0hFTUFUQToiKTsKLQkJSkRCQ1Rvb2xzLmR1bXAoY29ubmVjdGlvbi5nZXRNZXRhRGF0YSgpLmdldFNjaGVtYXMoKSk7Ci0JCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFVSTChDb25uZWN0aW9uQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gImpkYmM6IiArIGNvbmZpZy5kYXRhYmFzZVVSTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgREVSQlkgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJEZXJieSIsCi0JCQkib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIiwKLQkJCSJkZXJieTpDOi9kZXJieS9kYXRhL3Rlc3QiLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBNWVNRTCA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIk15U1FMIiwKLQkJCSJjb20ubXlzcWwuamRiYy5Ecml2ZXIiLAotCQkJIm15c3FsOi8vbG9jYWxob3N0OjMzMDYiLAotCQkJInJvb3QiLAotCQkJIm9yYWNsZSIKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBPUkFDTEUgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJPcmFjbGUiLAotCQkJIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciIsCi0JCQkib3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOm9yY2wiLAotCQkJInNjb3R0IiwKLQkJCSJ0aWdlciIKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBQT1NUR1JFU1FMID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiUG9zdGdyZVNRTCIsCi0JCQkib3JnLnBvc3RncmVzcWwuRHJpdmVyIiwKLQkJCSJwb3N0Z3Jlc3FsOnBvc3RncmVzIiwKLQkJCSJwb3N0Z3JlcyIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JLy8gdGhlIFN5YmFzZSBzZXJ2ZXIgbXVzdCBiZSBjb25maWd1cmVkIGV4cGxpY2l0bHkgdG8gImxvY2FsaG9zdCIKLQkvLyBpbiB0aGUgY29uZmlnIGZpbGUgW1NZQkFTRV0vaW5pL3NxbC5pbmkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgU1lCQVNFID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiU3liYXNlIiwKLQkJCSJjb20uc3liYXNlLmpkYmMzLmpkYmMuU3liRHJpdmVyIiwKLQkJCSJzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwIiwKLQkJCSJzYSIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uQ29uZmlnIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwbGF0Zm9ybU5hbWU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRhdGFiYXNlVVJMOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHVzZXI7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7Ci0JCXByb3RlY3RlZCBDb25uZWN0aW9uQ29uZmlnKAotCQkJCVN0cmluZyBwbGF0Zm9ybU5hbWUsCi0JCQkJU3RyaW5nIGRyaXZlckNsYXNzTmFtZSwKLQkJCQlTdHJpbmcgZGF0YWJhc2VVUkwsCi0JCQkJU3RyaW5nIHVzZXIsCi0JCQkJU3RyaW5nIHBhc3N3b3JkCi0JCSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGxhdGZvcm1OYW1lID0gcGxhdGZvcm1OYW1lOwotCQkJdGhpcy5kcml2ZXJDbGFzc05hbWUgPSBkcml2ZXJDbGFzc05hbWU7Ci0JCQl0aGlzLmRhdGFiYXNlVVJMID0gZGF0YWJhc2VVUkw7Ci0JCQl0aGlzLnVzZXIgPSB1c2VyOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzk4ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVzdWx0U2V0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlkdW1wKGV4ZWN1dGUoY29ubmVjdGlvbiwgc3FsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQlkdW1wT24ocmVzdWx0U2V0LCBwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHVtcE9uKFJlc3VsdFNldCByZXN1bHRTZXQsIFByaW50V3JpdGVyIHB3KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBtYXBzID0gY29udmVydFRvTWFwcyhyZXN1bHRTZXQpOwotCQlmb3IgKEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBtYXBTdHJlYW0gPSBtYXBzLml0ZXJhdG9yKCk7IG1hcFN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVN0cmVhbSA9IG1hcFN0cmVhbS5uZXh0KCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBlbnRyeVN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCU1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyeVN0cmVhbS5uZXh0KCk7Ci0JCQkJcHcucHJpbnQoZW50cnkuZ2V0S2V5KCkpOwotCQkJCXB3LnByaW50KCIgPSAiKTsKLQkJCQlwdy5wcmludChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCQlpZiAobWFwU3RyZWFtLmhhc05leHQoKSkgewotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJfQotCQlwdy5wcmludGxuKCJ0b3RhbCByb3dzOiAiICsgbWFwcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb252ZXJ0VG9NYXBzKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb252ZXJ0VG9NYXBzKGV4ZWN1dGUoY29ubmVjdGlvbiwgc3FsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXN1bHRTZXQgZXhlY3V0ZShDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKLQkJc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKLQkJUmVzdWx0U2V0IHJlc3VsdFNldCA9IHN0YXRlbWVudC5nZXRSZXN1bHRTZXQoKTsKLQkJc3RhdGVtZW50LmNsb3NlKCk7Ci0JCXJldHVybiByZXN1bHRTZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGNvbnZlcnRUb01hcHMoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7Ci0JCWZvciAoSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0cmVhbSA9IGJ1aWxkTWFwSXRlcmF0b3IocmVzdWx0U2V0KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlyb3dzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBidWlsZE1hcEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJlc3VsdFNldEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PihyZXN1bHRTZXQsIG5ldyBNYXBSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoYnVpbGRDb2x1bW5OYW1lcyhyZXN1bHRTZXQpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBidWlsZENvbHVtbk5hbWVzKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcmVzdWx0U2V0LmdldE1ldGFEYXRhKCkuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWVzW2ldID0gcmVzdWx0U2V0LmdldE1ldGFEYXRhKCkuZ2V0Q29sdW1uTmFtZShpICsgMSk7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyIGltcGxlbWVudHMgUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gewotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzOwotCQlwdWJsaWMgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKFN0cmluZ1tdIGNvbHVtbk5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb2x1bW5OYW1lcyA9IGNvbHVtbk5hbWVzOwotCQl9Ci0JCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0Pih0aGlzLmNvbHVtbk5hbWVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQltYXAucHV0KHRoaXMuY29sdW1uTmFtZXNbaV0sIHJzLmdldE9iamVjdChpICsgMSkpOyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQkJfQotCQkJcmV0dXJuIG1hcDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzRkMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogIEpQVCBEQiBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RGJUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQWxsUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEpwdERiVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTE3YjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiAgSnB0RGJUZXN0c1BsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RGJUZXN0c1BsdWdpbiBJTlNUQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERiVGVzdHNQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdERiVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlY2U3ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZXJieVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE15U1FMVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlMTBnVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdYRVRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlOWlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQb3N0Z3JlU1FMVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShTUUxTZXJ2ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeWJhc2VUZXN0cy5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQWxsUGxhdGZvcm1UZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2E1Nzc5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOwotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkNvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklEcml2ZXJNZ210Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5JUHJvcGVydHlTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLlByb3BlcnR5U2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuWE1MRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmpkYmMuSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwuQ29ubmVjdGl2aXR5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleS5Db2x1bW5QYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVzdWx0U2V0SXRlcmF0b3I7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGVzdGluZyBEVFAgd3JhcHBlcnMgb24gdmFyaW91cyBkYXRhYmFzZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFBsYXRmb3JtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gcHJvcGVydGllcyBhcmUgbG9hZGVkIGZyb20gYSBKYXZhIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUKLQkgKiAnb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZycgZGlyZWN0b3J5LiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcwotCSAqIGl0cyBvd24gcHJvcGVydGllcyBmaWxlIChlLmcuICdkZXJieS5wcm9wZXJ0aWVzJykuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIHdyYXBwZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfUFJPUEVSVFkgPSAidXNlcklEIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfREVGQVVMVCA9ICJ1c2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9ERUZBVUxUID0gIiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfRFJJVkVSX0pBUlNfUFJPUEVSVFkgPSAiamFycyI7Ci0JCS8vIHJlcXVpcmVkIC0gbm8gZGVmYXVsdAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VSTF9QUk9QRVJUWSA9ICJ1cmwiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBEVFBQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQtdXAvdGVhci1kb3duICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSB0aGlzLmxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQkJdGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCk7Ci0JCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl0aGlzLnBsYXRmb3JtUHJvcGVydGllcyA9IG51bGw7Ci0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvLyAqKioqKiBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUKLQlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFBsYXRmb3JtUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAubG9hZCh0aGlzLmJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpLm9wZW5TdHJlYW0oKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgVVJMIGJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEJ1bmRsZSh0aGlzLmdldFRlc3RQbHVnaW5CdW5kbGVJRCgpKS5nZXRFbnRyeSh0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRlc3RQbHVnaW5CdW5kbGVJRCgpIHsKLQkJcmV0dXJuIEpwdERiVGVzdHNQbHVnaW4uQlVORExFX0lEOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgKyAnLycgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIFBMQVRGT1JNX0NPTkZJR19ESVJFQ1RPUlk7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkYXRhYmFzZSBwbGF0Zm9ybSBoYXMgYSBzZXBhcmF0ZSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlICdjb25maWcnCi0JICogZGlyZWN0b3J5IHRoYXQgbXVzdCBiZSBjdXN0b21pemVkIGJ5IHdob21ldmVyIGlzIGV4ZWN1dGluZyB0aGUgdGVzdHMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpOwotCi0JLy8gKioqKiogZHJpdmVyIGRlZmluaXRpb24gZmlsZQotCXByaXZhdGUgdm9pZCBidWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlYTUxGaWxlTWFuYWdlci5zZXRTdG9yYWdlTG9jYXRpb24odGhpcy5nZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSk7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldEZpbGVOYW1lKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSk7Ci0KLQkJSVByb3BlcnR5U2V0W10gc2V0cyA9IFhNTEZpbGVNYW5hZ2VyLmxvYWRQcm9wZXJ0eVNldHMoKTsKLQkJZm9yIChJUHJvcGVydHlTZXQgc2V0IDogc2V0cykgewotCQkJaWYgKHNldC5nZXRJRCgpLmVxdWFscyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKSkgewotCQkJCXJldHVybjsgIC8vIHByb3BlcnR5IHNldHMgbGl2ZSBhY3Jvc3MgdGVzdHMKLQkJCX0KLQkJfQotCi0JCVhNTEZpbGVNYW5hZ2VyLnNhdmVOYW1lZFByb3BlcnR5U2V0KHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkpOwotCi0JCS8vIHZlcmlmeSB0aGUgZmlsZSB3YXMgY3JlYXRlZDoKLQkJRmlsZSBkcml2ZXJEZWZpbml0aW9uZUZpbGUgPSB0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpLmFwcGVuZCh0aGlzLmdldERUUERyaXZlckZpbGVOYW1lKCkpLnRvRmlsZSgpOwotCQlhc3NlcnRUcnVlKGRyaXZlckRlZmluaXRpb25lRmlsZS5leGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBDb25uZWN0aXZpdHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREVFBEcml2ZXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIElEcml2ZXJNZ210Q29uc3RhbnRzLkRSSVZFUl9GSUxFOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5U2V0W10gYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkgewotCQlJUHJvcGVydHlTZXRbXSBwcm9wZXJ0eVNldHMgPSBuZXcgSVByb3BlcnR5U2V0WzFdOwotCQlQcm9wZXJ0eVNldEltcGwgcHJvcGVydHlTZXQgPSBuZXcgUHJvcGVydHlTZXRJbXBsKHRoaXMuZ2V0RHJpdmVyTmFtZSgpLCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQkJcHJvcGVydHlTZXQuc2V0UHJvcGVydGllcyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpLCB0aGlzLmJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSk7Ci0JCXByb3BlcnR5U2V0c1swXSA9IHByb3BlcnR5U2V0OwotCQlyZXR1cm4gcHJvcGVydHlTZXRzOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKTsKLQotCXByaXZhdGUgUHJvcGVydGllcyBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfSkFSX0xJU1RfUFJPUF9JRCwgdGhpcy5nZXRKREJDRHJpdmVySmFyTGlzdCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogVGhlIEpBUiBsaXN0IGlzIHdvcmtzcGFjZS1zcGVjaWZpYyBhbmQgaXMgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SkRCQ0RyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlcXVpcmVkUGxhdGZvcm1Qcm9wZXJ0eShEQl9EUklWRVJfSkFSU19QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFRoZSBkYXRhYmFzZSBVUkwgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZQotCSAqIGZvciBzb21lIGRhdGFiYXNlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDVVJMKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVJMX1BST1BFUlRZLCB0aGlzLmdldERlZmF1bHRKREJDVVJMKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdXNlciBJRCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlcklEKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVNFUl9JRF9QUk9QRVJUWSwgREJfVVNFUl9JRF9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFzc3dvcmQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KERCX1BBU1NXT1JEX1BST1BFUlRZLCBEQl9QQVNTV09SRF9ERUZBVUxUKTsKLQl9Ci0KLQkvLyAqKioqKiBEVFAgY29ubmVjdGlvbiBwcm9maWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUodGhpcy5nZXRQcm9maWxlTmFtZSgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBwcm9maWxlcyBsaXZlIGFjcm9zcyB0ZXN0cwotCQl9Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIHByb2ZpbGVOYW1lKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuY3JlYXRlUHJvZmlsZSgKLQkJCQlwcm9maWxlTmFtZSwKLQkJCQl0aGlzLmdldFByb2ZpbGVEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0UHJvdmlkZXJJRCgpLAotCQkJCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uUHJvZmlsZS5DT05ORUNUSU9OX1BST0ZJTEVfVFlQRTsKLQl9Ci0JIAotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfREVGSU5JVElPTl9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJDbGFzcygpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQsIHRoaXMuZ2V0SkRCQ1VSTCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0KLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lELCB0aGlzLnBhc3N3b3JkSXNTYXZlZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRJc1NhdmVkKCkgewotCQlyZXR1cm4gInRydWUiOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCVRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIGNwTmFtZTEgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMSI7Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZShjcE5hbWUxKTsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENQID0gdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUoY3BOYW1lMSk7Ci0JCWFzc2VydE5vdE51bGwoZHRwQ1ApOwotCi0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5hZGRlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCVN0cmluZyBjcE5hbWUyID0gdGhpcy5nZXRQcm9maWxlTmFtZSgpICsgIjIiOwotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkubW9kaWZ5UHJvZmlsZShkdHBDUCwgY3BOYW1lMiwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5yZW5hbWVkT2xkTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUyLCBsaXN0ZW5lci5yZW5hbWVkTmV3TmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lMik7Ci0JCWFzc2VydE5vdE51bGwoY3ApOwotCi0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5kZWxldGVQcm9maWxlKGR0cENQKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbW92ZWROYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQljcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpKTsKLQotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpOwotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVuZG9yKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VDb250ZW50KCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZGF0YWJhc2UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBkYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IHRoaXMuZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSAiZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgLSBhY3R1YWw6ICIgKyBhY3R1YWw7Ci0JCS8vIHBhcnRpYWwgbWF0Y2ggaXMgZ29vZCBlbm91Z2gKLQkJYXNzZXJ0VHJ1ZShlcnJvck1lc3NhZ2UsIGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVuZG9yKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlbmRvck5hbWUoKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlQ29udGVudCgpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydFRydWUoZGF0YWJhc2UuZ2V0U2NoZW1hdGFTaXplKCkgPj0gMCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IGRhdGFiYXNlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlc1NpemUoKSA+IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS5nZXRUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldENvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpOwotCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdE9mZmxpbmUoKSB7Ci0JCWlmICggISB0aGlzLmV4ZWN1dGVPZmZsaW5lVGVzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzV29ya2luZ09mZmxpbmUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvck9mZmxpbmVXb3JrKCkgewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ29ubmVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5leGVjdXRlT2ZmbGluZVRlc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9wZW5lZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9rVG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmFib3V0VG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmNsb3NlZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyRGF0YWJhc2UoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJDYXRhbG9nKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyB0YWtlIHRoZSBmaXJzdCBjYXRhbG9nCi0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgPSB0aGlzLmdldEZpcnN0RFRQQ2F0YWxvZygpOwotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cENhdGFsb2cpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCBsaXN0ZW5lci5jaGFuZ2VkQ2F0YWxvZyk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyU2NoZW1hKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncyA9IHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKTsKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hID0gbnVsbDsKLQkJU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOwotCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIGR0cENhdGFsb2cuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKGR0cENhdGFsb2cuZ2V0TmFtZSgpKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkdHBDYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJc2NoZW1hID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOyAgLy8gc2hvdWxkIGJlIHRoZSAidmlydHVhbCIgY2F0YWxvZwotCQkJCWFzc2VydEVxdWFscygiIiwgZHRwQ2F0YWxvZy5nZXROYW1lKCkpOwotCQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSBkdHBDYXRhbG9nLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBoZWxkIGRpcmVjdGx5IGJ5IHRoZSBkYXRhYmFzZSBpbiB0aGlzIHNpdHVhdGlvbgotCQkJCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHNjaGVtYS5nZXRUYWJsZXNTaXplKCkgPj0gMCk7ICAvLyBmb3JjZSB0YWJsZXMgdG8gYmUgbG9hZGVkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cFNjaGVtYSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgbGlzdGVuZXIuY2hhbmdlZFNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzID0gdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCWFzc2VydEVxdWFscyhzdXBwb3J0c0NhdGFsb2dzLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKTsKLQkJaWYgKHN1cHBvcnRzQ2F0YWxvZ3MpIHsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dzU2l6ZSgpID4gMCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYXRhU2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3NTaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hdGFTaXplKCkgPiAwKTsKLQkJfQotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpOwotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3MoKTsKLS8vCQl0aGlzLmR1bXBKREJDU2NoZW1hdGEoKTsKLS8vCQl0aGlzLmR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCS8qKgotCSAqIG9ubHkgdmFsaWQgb24gZGF0YWJhc2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgY2F0YWxvZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nIGdldENhdGFsb2dOYW1lZChTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoY2F0YWxvZ05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUtleSkgewotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvcGVydHlWYWx1ZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhYmFzZSBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUgJyIgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkKLQkJCQkJKyAiJyBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSAnIiArIHByb3BlcnR5S2V5ICsgIicuIik7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY3AsICJoYXNBbnlMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY3AsICJoYXNOb0xpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQIG1vZGVsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9maWxlTWFuYWdlciBnZXREVFBQcm9maWxlTWFuYWdlcigpIHsKLQkJcmV0dXJuIFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb25uZWN0aW9uUHJvZmlsZSBnZXREVFBDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUNvbm5lY3Rpb25Qcm9maWxlIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoSUNvbm5lY3Rpb25Qcm9maWxlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShjcCwgImR0cENvbm5lY3Rpb25Qcm9maWxlIik7Ci0JfQotCi0JcHJvdGVjdGVkIElNYW5hZ2VkQ29ubmVjdGlvbiBnZXREVFBNYW5hZ2VkQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChJTWFuYWdlZENvbm5lY3Rpb24pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsICJkdHBNYW5hZ2VkQ29ubmVjdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXREVFBEYXRhYmFzZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkYXRhYmFzZSwgImR0cERhdGFiYXNlIik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGdldERUUENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldENhdGFsb2dzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldEZpcnN0RFRQQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKS5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RFRQQ2F0YWxvZyh0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKG5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHNjaGVtYSwgImR0cFNjaGVtYSIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGVjdXRlIFNRTCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpZ25vcmUgYW55IGVycm9ycyAodXNlZnVsIGZvciBkcm9wcGluZyBkYXRhYmFzZSBvYmplY3RzIHRoYXQgbWlnaHQKLQkgKiBub3QgYmUgdGhlcmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycyhTdHJpbmcgc3FsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU1FMOiAiICsgc3FsKTsKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQl0cnkgewotCQkJamRiY1N0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoc3FsLCAyMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcChTdHJpbmcgc3FsLCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wT24oc3FsLCBwdywgY29sdW1uV2lkdGgpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE9uKFN0cmluZyBzcWwsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKHNxbCk7Ci0JCWZvciAoQXJyYXlMaXN0PE9iamVjdD4gcm93IDogdGhpcy5leGVjdXRlKHNxbCkpIHsKLQkJCWZvciAoT2JqZWN0IGNvbHVtblZhbHVlIDogcm93KSB7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGNvbHVtblZhbHVlKSwgY29sdW1uV2lkdGgsIHB3KTsKLQkJCQlwdy5wcmludCgnICcpOwotCQkJfQotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gZXhlY3V0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IGpkYmNTdGF0ZW1lbnQgPSB0aGlzLmNyZWF0ZUpEQkNTdGF0ZW1lbnQoKTsKLQkJamRiY1N0YXRlbWVudC5leGVjdXRlKHNxbCk7Ci0JCUFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gcm93cyA9IHRoaXMuYnVpbGRSb3dzKGpkYmNTdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCkpOwotCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IGJ1aWxkUm93cyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiByb3dzID0gbmV3IEFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4oKTsKLQkJZm9yIChJdGVyYXRvcjxBcnJheUxpc3Q8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5idWlsZEFycmF5SXRlcmF0b3IocmVzdWx0U2V0KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlyb3dzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+IGJ1aWxkQXJyYXlJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxBcnJheUxpc3Q8T2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyIGltcGxlbWVudHMgUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlcjxBcnJheUxpc3Q8T2JqZWN0Pj4gewotCQlwcml2YXRlIGZpbmFsIGludCBjb2x1bW5Db3VudDsKLQkJcHVibGljIExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoaW50IGNvbHVtbkNvdW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50OwotCQl9Ci0JCXB1YmxpYyBBcnJheUxpc3Q8T2JqZWN0PiBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4odGhpcy5jb2x1bW5Db3VudCk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQlsaXN0LmFkZChycy5nZXRPYmplY3QoaSkpOwotCQkJfQotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZUpEQkNTdGF0ZW1lbnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5jcmVhdGVTdGF0ZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRKREJDQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuICgoQ29ubmVjdGlvbkluZm8pIHRoaXMuZ2V0RFRQTWFuYWdlZENvbm5lY3Rpb24oKS5nZXRDb25uZWN0aW9uKCkuZ2V0UmF3Q29ubmVjdGlvbigpKS5nZXRTaGFyZWRDb25uZWN0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlTWV0YURhdGEgZ2V0RGF0YWJhc2VNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLmdldE1ldGFEYXRhKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgRFRQIG1ldGFkYXRhICoqKioqKioqKioKLQotCS8qKgotCSAqIGR1bXAgYWxsIHRoZSBkYXRhYmFzZSBtZXRhZGF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZSgpIHsKLQkJdGhpcy5kdW1wRGF0YWJhc2UodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogZHVtcCB0aGUgZGF0YWJhc2UgY2F0YWxvZ3MgYW5kIHNjaGVtYXRhIHRvIHRoZSBjb25zb2xlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlQ29udGFpbmVycygpIHsKLQkJdGhpcy5kdW1wRGF0YWJhc2UoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZShib29sZWFuIGRlZXApIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcERhdGFiYXNlT24ocHcsIGRlZXApOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJcHcucHJpbnQoImRhdGFiYXNlOiAiKTsKLQkJcHcucHJpbnRsbihkYXRhYmFzZS5nZXROYW1lKCkpOwotCQlpZiAoZGF0YWJhc2Uuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IGRhdGFiYXNlLmdldENhdGFsb2dzKCkpIHsKLQkJCQl0aGlzLmR1bXBDYXRhbG9nT24oY2F0YWxvZywgcHcsIGRlZXApOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oZGF0YWJhc2UsIHB3LCBkZWVwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDYXRhbG9nT24oQ2F0YWxvZyBjYXRhbG9nLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJjYXRhbG9nOiAiKTsKLQkJcHcucHJpbnRsbihjYXRhbG9nLmdldE5hbWUoKSk7Ci0JCXB3LmluZGVudCgpOwotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oY2F0YWxvZywgcHcsIGRlZXApOwotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hQ29udGFpbmVyT24oU2NoZW1hQ29udGFpbmVyIHNjaGVtYUNvbnRhaW5lciwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlmb3IgKFNjaGVtYSBzY2hlbWEgOiBzY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hdGEoKSkgewotCQkJdGhpcy5kdW1wU2NoZW1hT24oc2NoZW1hLCBwdywgZGVlcCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5kdW1wU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYShTY2hlbWEgc2NoZW1hLCBib29sZWFuIGRlZXApIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcFNjaGVtYU9uKHNjaGVtYSwgcHcsIGRlZXApOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYU9uKFNjaGVtYSBzY2hlbWEsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJcHcucHJpbnQoInNjaGVtYTogIik7Ci0JCXB3LnByaW50bG4oc2NoZW1hLmdldE5hbWUoKSk7Ci0JCWlmIChkZWVwKSB7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlmb3IgKFRhYmxlIHRhYmxlIDogc2NoZW1hLmdldFRhYmxlcygpKSB7Ci0JCQkJCXRoaXMuZHVtcFRhYmxlT24odGFibGUsIHB3KTsKLQkJCQl9Ci0JCQkJZm9yIChTZXF1ZW5jZSBzZXF1ZW5jZSA6IHNjaGVtYS5nZXRTZXF1ZW5jZXMoKSkgewotCQkJCQl0aGlzLmR1bXBTZXF1ZW5jZU9uKHNlcXVlbmNlLCBwdyk7Ci0JCQkJfQotCQkJcHcudW5kZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wVGFibGVPbihUYWJsZSB0YWJsZSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInRhYmxlOiAiKTsKLQkJcHcucHJpbnRsbih0YWJsZS5nZXROYW1lKCkpOwotCQlwdy5pbmRlbnQoKTsKLQkJCWZvciAoQ29sdW1uIGNvbHVtbiA6IHRhYmxlLmdldENvbHVtbnMoKSkgewotCQkJCXRoaXMuZHVtcENvbHVtbk9uKGNvbHVtbiwgcHcpOwotCQkJfQotCQkJZm9yIChGb3JlaWduS2V5IGZvcmVpZ25LZXkgOiB0YWJsZS5nZXRGb3JlaWduS2V5cygpKSB7Ci0JCQkJdGhpcy5kdW1wRm9yZWlnbktleU9uKGZvcmVpZ25LZXksIHB3KTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcENvbHVtbk9uKENvbHVtbiBjb2x1bW4sIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJjb2x1bW46ICIpOwotCQlwdy5wcmludChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiA6ICIpOwotCQlwdy5wcmludChjb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlpZiAoY29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKSB7Ci0JCQlwdy5wcmludCgiIFtwcmltYXJ5IGtleV0iKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEZvcmVpZ25LZXlPbihGb3JlaWduS2V5IGZvcmVpZ25LZXksIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJmb3JlaWduIGtleTogIik7Ci0JCXB3LnByaW50KGZvcmVpZ25LZXkuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIj0+Iik7Ci0JCXB3LnByaW50KGZvcmVpZ25LZXkuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiAoIik7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJQ29sdW1uUGFpciBjcCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlwdy5wcmludChjcC5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCI9PiIpOwotCQkJcHcucHJpbnQoY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXB3LnByaW50KCIsICIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50KCcpJyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2VxdWVuY2VPbihTZXF1ZW5jZSBzZXF1ZW5jZSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInNlcXVlbmNlOiAiKTsKLQkJcHcucHJpbnRsbihzZXF1ZW5jZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkdW1wIEpEQkMgbWV0YWRhdGEgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNDYXRhbG9ncygpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wSkRCQ0NhdGFsb2dzT24ocHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNDYXRhbG9nc09uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcHcucHJpbnRsbigiSkRCQyBjYXRhbG9nczogIik7Ci0JCXB3LmluZGVudCgpOwotCQkJQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiByb3dzID0gdGhpcy5idWlsZFJvd3ModGhpcy5nZXREYXRhYmFzZU1ldGFEYXRhKCkuZ2V0Q2F0YWxvZ3MoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPEFycmF5TGlzdDxPYmplY3Q+PiBzdHJlYW0gPSByb3dzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXB3LnByaW50bG4oc3RyZWFtLm5leHQoKS5nZXQoMCkpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ1NjaGVtYXRhKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDU2NoZW1hdGFPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ1NjaGVtYXRhT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIHNjaGVtYXRhOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRTY2hlbWFzKCkpOwotCQkJZm9yIChBcnJheUxpc3Q8T2JqZWN0PiByb3cgOiByb3dzKSB7Ci0JCQkJaWYgKHJvdy5zaXplKCkgPT0gMikgeyAgLy8gY2F0YWxvZ3Mgd2VyZSBhZGRlZCBpbiBqZGsgMS40Ci0JCQkJCU9iamVjdCBjYXRhbG9nID0gcm93LmdldCgxKTsKLQkJCQkJcHcucHJpbnQoY2F0YWxvZyk7Ci0JCQkJCXB3LnByaW50KCcuJyk7Ci0JCQkJfQotCQkJCU9iamVjdCBzY2hlbWEgPSByb3cuZ2V0KDApOwotCQkJCXB3LnByaW50bG4oc2NoZW1hKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBTdHJpbmcgYWRkZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWRPbGROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWROZXdOYW1lOwotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBvbGROYW1lOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLmFkZGVkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbW92ZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb3BlbmVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG1vZGlmaWVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG9rVG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBhYm91dFRvQ2xvc2VQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY2xvc2VkUHJvZmlsZTsKLQkJcHVibGljIERhdGFiYXNlIGNoYW5nZWREYXRhYmFzZTsKLQkJcHVibGljIENhdGFsb2cgY2hhbmdlZENhdGFsb2c7Ci0JCXB1YmxpYyBTY2hlbWEgY2hhbmdlZFNjaGVtYTsKLQkJcHVibGljIFNlcXVlbmNlIGNoYW5nZWRTZXF1ZW5jZTsKLQkJcHVibGljIFRhYmxlIGNoYW5nZWRUYWJsZTsKLQkJcHVibGljIENvbHVtbiBjaGFuZ2VkQ29sdW1uOwotCQlwdWJsaWMgRm9yZWlnbktleSBjaGFuZ2VkRm9yZWlnbktleTsKLQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5vcGVuZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMub2tUb0Nsb3NlUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5jbG9zZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXRoaXMuY2hhbmdlZERhdGFiYXNlID0gZGF0YWJhc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IHNjaGVtYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCXRoaXMuY2hhbmdlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IHRhYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gY29sdW1uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5tb2RpZmllZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuYWJvdXRUb0Nsb3NlUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ2F0YWxvZyA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTY2hlbWEgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkVGFibGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZEZvcmVpZ25LZXkgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDEwY2M3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERlcmJ5VGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBEZXJieVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gImRlcmJ5LnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5EZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5MTAxLmdlbmVyaWNEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJEZXJieSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAuMSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiRGVyYnlfMTAuMV9FbWJlZGRlZCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiRGVyYnkgMTAuMSBFbWJlZGRlZCBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5kZXJieS5lbWJlZGRlZC5jb25uZWN0aW9uUHJvZmlsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMSIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBURVNUMiIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDIiKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWEyKTsgIC8vIHNob3VsZCBiZSBudWxsIHVudGlsIHJlZnJlc2gKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIikpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgc2NoZW1hIGFmdGVyIHRoZSByZWZyZXNoCi0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBMT09LVVBfVEVTVCIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUlkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIik7Ci0JCWFzc2VydEVxdWFscygiTE9PS1VQX1RFU1QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBfVGVzdCIpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImxvb2t1cF9URVNUXCIiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImxvb2t1cF9URVNUXCIiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRBQkxFX1RFU1QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm9vVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlRFR0VSIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRUcnVlKG5hbWVDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkJBUl9JRCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJQ29sdW1uIHNhbGFyeUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJTQUxBUlkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUNJTUFMIiwgc2FsYXJ5Q29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzYWxhcnlDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzYWxhcnlDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIHNhbGFyeUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygyLCBzYWxhcnlDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgc2FsYXJ5Q29sdW1uLmdldExlbmd0aCgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9JRCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMywgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQotCQlDb2x1bW4gaWQyQ29sdW1uID0gYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEMiIpOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZDJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotLy8JCWFzc2VydFRydWUoaWQyQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCQlhc3NlcnRGYWxzZShpZDJDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFByZWNpc2lvbigpKTsgIC8vIG5vdCBzdXJlIHdoYXQgdG8gZXhwZWN0IGhlcmUuLi4KLQkJYXNzZXJ0RXF1YWxzKDAsIGlkMkNvbHVtbi5nZXRTY2FsZSgpKTsgIC8vIG5vdCBzdXJlIHdoYXQgdG8gZXhwZWN0IGhlcmUgZWl0aGVyLi4uCi0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gQkFaCi0JCVRhYmxlIGJhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkJBWiIpOwotCQlDb2x1bW4gbmlja25hbWVDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiTklDS05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBuaWNrbmFtZUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShuaWNrbmFtZUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7ICAvLyBkb2Vzbid0IHdvcmsoPykKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJGT09fQkFaIik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoIkZPT19JRCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRDIgSU5UIFVOSVFVRSBOT1QgTlVMTCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBDSFVOSyBCTE9CKDEwMEspIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT08gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIFNBTEFSWSBERUNJTUFMKDExLCAyKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVJfSUQgSU5UIFJFRkVSRU5DRVMgQkFSKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBJTlQgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTklDS05BTUUgVkFSQ0hBUigyMCkgTk9UIE5VTEwgVU5JUVVFIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT09fQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT09fSUQgSU5UIFJFRkVSRU5DRVMgRk9PKElEKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVpfSUQgSU5UIFJFRkVSRU5DRVMgQkFaKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJDT0xVTU5fVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBDT0xVTU5fVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBDT0xVTU5fVEVTVCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiQ09MVU1OX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJDT0xVTU5fVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIElOVEVHRVIsIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIElOVEVHRVIsIE5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIElOVEVHRVIsIFwiTmFtZVwiIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiQ09MVU1OX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJDT0xVTU5fVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgT1JHIChJRCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgRU1QIChJRCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIoMjApLCAiICsKLQkJCQkiT1JHX0lEIElOVEVHRVIgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJYUkVGX1RFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJPUkciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoIkVNUCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIk9SRyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk9SR19JRCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihzY2hlbWFOYW1lKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcih0YWJsZU5hbWUpICE9IG51bGwpIHsKLQkJCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVEFCTEUgIiArIHNjaGVtYU5hbWUgKyAnLicgKyB0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTkI6IEEgRGVyYnkgc2NoZW1hIG11c3QgYmUgZW1wdHkgYmVmb3JlIGl0IGNhbiBiZSBkcm9wcGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBkcm9wU2NoZW1hKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKG5hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTQ0hFTUEgIiArIG5hbWUgKyAiIFJFU1RSSUNUIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvTXlTUUxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjIwZGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotLyoqCi0gKiBNeVNRTAotICogCi0gKiBOb3RlczoKLSAqIC0gV2UgY2FuIG9ubHkgZ2V0IGRhdGFiYXNlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIG91cgotICogICAgIGNvbm5lY3Rpb24gcHJvZmlsZS4KLSAqIC0gV2UgY2FuIHJlZmVyZW5jZSBvYmplY3RzIGFjcm9zcyBtdWx0aXBsZSBkYXRhYmFzZXMsIHNvIHRoZXkgYXJlIHNvcnRhIGxpa2UKLSAqICAgICBzY2hlbWFzLi4uLgotICogLSBGb3JlaWduIGtleXMgbXVzdCBiZSBkZWZpbmVkIGFzIHRhYmxlLWxldmVsIGNvbnN0cmFpbnRzOyB0aGV5IGNhbm5vdCBiZQotICogICAgIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgY29sdW1uIGNsYXVzZS4KLSAqIC0gQ2FzZS1zZW5zaXRpdml0eSBhbmQgLWZvbGRpbmcgaXMgd2hhY2tlZCBvbiBNeVNRTC4uLi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTXlTUUxUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE15U1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAibXlzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk15U1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk15U1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm15c3FsLjRfMS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJNeVNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiNC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5teXNxbC5qZGJjLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuICJqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUxfNC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJNeVNRTCA0LjEgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBzdXBlci5idWlsZERUUENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiAiZGFsaXRlc3QiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCXJldHVybiB0cnVlOyAgLy8gc2VlbXMgdG8gd29yay4uLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyBEVFA6IE15U1FMIGhhcyBhIHNpbmdsZSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkYXRhYmFzZQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREZWZhdWx0U2NoZW1hKCksIHNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFICIgKyB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2codGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCS8vIGZvbwotCQlUYWJsZSBmb29UYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbk5hbWVkKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXIiKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBJTlRFR0VSLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPUkVJR04gS0VZIChiYXJfaWQpIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoZm9vX2lkKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhel9pZCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT24gV2luZG93cywgdGFibGUgbmFtZXMgZ2V0IGZvbGRlZCB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdDsKLQkgKiBldmVuIGlmIHRoZSBuYW1lIGlzIGRlbGltaXRlZCAoYXBwYXJlbnRseSkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSAiICsgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImBURVNUM2AiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGBURVNUM2AgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlUYWJsZSB0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQotCQkvLyB0aGlzIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gV2luZG93cwotCQlUYWJsZSB0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQkvLyB0aGlzIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gV2luZG93cwotCQlUYWJsZSB0ZXN0M1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiYHRlc3QzYCIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QzVGFibGUpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImBURVNUM2AiKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFICIgKyB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2codGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIElOVEVHRVIsIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGBJZGAgSU5URUdFUiwgYE5hbWVgIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJgSWRgIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImBOYW1lYCIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIG9ubHkgZ2V0IGEgc2luZ2xlICJzY2hlbWEiIHBlciBjb25uZWN0aW9uIHZpYSBEVFAsCi0JICogc28gY3Jvc3Mtc2NoZW1hIHJlZmVyZW5jZXMgYXJlIG5vdCB2aXNpYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MiIpOwotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFIHhyZWZfdGVzdDEiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgb3JnIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgZW1wIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFZBUkNIQVIoMjApLCAiICsKLQkJCQkib3JnX2lkIElOVEVHRVIsIEZPUkVJR04gS0VZIChvcmdfaWQpIFJFRkVSRU5DRVMgeHJlZl90ZXN0MS5vcmcoaWQpKSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQkvLyBubyBmb3JlaWduIGtleXMKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MiIpOwotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgZGJOYW1lLCBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgZGJOYW1lICsgJy4nICsgdGFibGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcERhdGFiYXNlKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAiICsgbmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzhhZDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTEwZ1Rlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlMTBnVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZy5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZ18xMC4xLjAuNCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnICgxMC4xLjAuNCkgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gT3JhY2xlIHNob3VsZCBoYXZlIGEgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlcgotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRVc2VySUQoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUjIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmFyIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJhciAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBjaHVuayBCTE9CIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb28gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSMigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmFyX2lkIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUjIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlwidGVzdDNcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QxIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBcInRlc3QzXCIgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJVGFibGUgdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0JCXRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCi0JCVRhYmxlIHRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCQl0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQlUYWJsZSB0ZXN0M1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiXCJ0ZXN0M1wiIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0JCXRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MyIpOwotCQlhc3NlcnROdWxsKHRlc3QzVGFibGUpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlwidGVzdDNcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIE5VTUJFUigxMCksIE5BTUUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIE5VTUJFUigxMCksIE5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIE5VTUJFUigxMCksIFwiTmFtZVwiIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXRVc2VyTmFtZSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTWVMiKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkIHRlc3Q6ICIgKyB0aGlzLmdldENsYXNzKCkgKyAnLicgKyB0aGlzLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm47ICAvLyBTWVMgZG9lcyBub3QgaGF2ZSBhIHNjaGVtYQotCQl9Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBVU0VSIFhSRUZfVEVTVDIgQ0FTQ0FERSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVVNFUiBYUkVGX1RFU1QxIENBU0NBREUiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBVU0VSIFhSRUZfVEVTVDEgSURFTlRJRklFRCBCWSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJBTFRFUiBVU0VSIFhSRUZfVEVTVDEgUVVPVEEgVU5MSU1JVEVEIE9OIFVTRVJTIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFhSRUZfVEVTVDEuT1JHIChJRCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIyKDIwKSkiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBVU0VSIFhSRUZfVEVTVDIgSURFTlRJRklFRCBCWSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJBTFRFUiBVU0VSIFhSRUZfVEVTVDIgUVVPVEEgVU5MSU1JVEVEIE9OIFVTRVJTIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiR1JBTlQgQUxMIE9OIFhSRUZfVEVTVDEuT1JHIFRPIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgWFJFRl9URVNUMi5FTVAgKElEIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUjIoMjApLCAiICsKLQkJCQkiT1JHX0lEIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJYUkVGX1RFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJPUkciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoIkVNUCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIk9SRyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk9SR19JRCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDIgQ0FTQ0FERSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVVNFUiBYUkVGX1RFU1QxIENBU0NBREUiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVEFCTEUgIiArIHRhYmxlTmFtZSArICIgQ0FTQ0FERSBDT05TVFJBSU5UUyIpOwotCX0KLQotLy8gbmVlZCBPcmFjbGUgZW5hYmxlbWVudCBwbHVnLWluCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJGT09fU0VRIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNFUVVFTkNFIEZPT19TRVEiKTsKLS8vCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLS8vCi0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFNlcXVlbmNlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT09fU0VRIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCBkcm9wU2VxdWVuY2UoU3RyaW5nIHNlcXVlbmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFNFUVVFTkNFICIgKyBzZXF1ZW5jZU5hbWUpOwotLy8JfQotLy8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wVXNlck9iamVjdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wKCJzZWxlY3QgKiBmcm9tIHVzZXJfb2JqZWN0cyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdYRVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMDlmOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnWEVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTEwZ1hFVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZ1hFLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnX1hFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgWEUgUmVsZWFzZSAyICgxMC4yKSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWM0NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDlpIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlOWlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTlpVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTlpLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgOWkgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS45LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlOWkiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk9yYWNsZTlpIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTRiYmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQb3N0Z3JlU1FMVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBQb3N0Z3JlU1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInBvc3RncmVzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5wb3N0Z3Jlc3FsLnBvc3RncmVzcWxEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOC54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJLy8gdXNpbmcgdGhpcyBVUkwgd2lsbCByZXN1bHQgaW4gdGhlIERUUCBkYXRhYmFzZSBjb250YWluaW5nIGEgc2luZ2xlCi0JCS8vIGNhdGFsb2cgbmFtZWQgIiIgLSB3aGljaCwgdW5mb3J0dW5hdGVseSwgcmVzZW1ibGVzIHRoZSBwc2V1ZG8tY2F0YWxvZwotCQkvLyBnZW5lcmF0ZWQgYnkgRFRQIGZvciBkYXRhYmFzZXMgdGhhdCBkbyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncyB2aWEKLQkJLy8gSkRCQyBtZXRhZGF0YSBjYWxscy4uLgotCQlyZXR1cm4gImpkYmM6cG9zdGdyZXNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIDguMiBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyBEVFAgZG9lcyBub3Qgc3VwcG9ydCBQb3N0Z3JlU1FMIG9mZi1saW5lIC0gc2VlIDIyNjcwNC8yNDE1NTgKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE51bGwoc2NoZW1hMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCXNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgTE9PS1VQX1RFU1QiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF90ZXN0IikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfdGVzdFwiIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUlkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBfVGVzdCIpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0Iik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIik7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoImJhcl9pZCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiQkFSIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJZVEVBIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQkvLyBhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZGF0YVR5cGVJc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PX0JBWiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkZPT19JRCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQ0hVTksgYnl0ZWEiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIHZhcmNoYXIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBpbnRlZ2VyIFJFRkVSRU5DRVMgQkFSKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgdmFyY2hhcigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBpbnQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBpbnQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgaW50LCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIGludCwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgaW50LCBOYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKFwiSWRcIiBpbnQsIFwiTmFtZVwiIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCksICIgKwotCQkJCSJPUkdfSUQgaW50ZWdlciBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoInhyZWZfdGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIm9yZyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgieHJlZl90ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygib3JnIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFNjaGVtYShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihuYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgU0NIRU1BICIgKyBuYW1lICsgIiBDQVNDQURFIik7Ci0JCX0KLQl9Ci0KLS8vIHNlZSAyNDE1NzgvMjQxNTU3Ci0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgU0VRVUVOQ0VfVEVTVCIpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PIFNUQVJUIDEiKTsKLS8vLy8JCUxpc3Q8T2JqZWN0W10+IGxpc3QgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBuZXh0dmFsKCdmb28nKSIpOwotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJTRVFVRU5DRV9URVNUIik7Ci0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSBzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZCgiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb29fc2VxIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIlNFUVVFTkNFX1RFU1QiLCAiRk9PIik7Ci0vLwkJdGhpcy5kcm9wU2NoZW1hKCJTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHZvaWQgZHJvcFNlcXVlbmNlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoc2NoZW1hTmFtZSk7Ci0vLwkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCWlmIChzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZChzZXF1ZW5jZU5hbWUpICE9IG51bGwpIHsKLS8vCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTRVFVRU5DRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHNlcXVlbmNlTmFtZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRkZTVkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBTUUwgU2VydmVyIDIwMDUgRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU1FMU2VydmVyVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBTUUxTZXJ2ZXJUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAic3Fsc2VydmVyLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJNaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXNmdC5zcWxzZXJ2ZXIuMjAwNS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJTUUxTZXJ2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjIwMDUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiU1FMU2VydmVyXzIwMDUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy5jb25uZWN0aW9uUHJvZmlsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBoYXZlbid0IGFjdHVhbGx5IHRyaWVkIHRoaXMgeWV0Li4uCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2VhOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TeWJhc2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5YmFzZVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgU3liYXNlVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInN5YmFzZS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlIEpEQkMgRHJpdmVyIGZvciBTeWJhc2UgQVNFIDE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uU3liYXNlIEpEQkMgRHJpdmVyIGZvciBTeWJhc2UgQVNFIDE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5zeWJhc2UuYXNlLmdlbmVyaWNEcml2ZXJUZW1wbGF0ZV8xNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJTeWJhc2VfQVNFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlXzE1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJTeWJhc2UgQVNFIDE1IGpDb25uZWN0IEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3liYXNlICJkYXRhYmFzZXMiIGJlY29tZSBEVFAgImNhdGFsb2dzIgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0ZXN0MiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRlc3QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCUNhdGFsb2cgY2F0YWxvZzEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cxKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSBjYXRhbG9nMS5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hMSwgY2F0YWxvZzEuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0ZXN0MiIpOwotCQlDYXRhbG9nIGNhdGFsb2cyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDIiKTsKLQkJYXNzZXJ0TnVsbChjYXRhbG9nMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCWNhdGFsb2cyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gY2F0YWxvZzIuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCi0JCWFzc2VydE5vdFNhbWUoY2F0YWxvZzEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIikpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgY2F0YWxvZyBhZnRlciB0aGUgcmVmcmVzaAotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIikuZ2V0RGVmYXVsdFNjaGVtYSgpKTsgIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IHNjaGVtYSBhZnRlciB0aGUgcmVmcmVzaAotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGVzdDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0YWJsZV90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ0YWJsZV90ZXN0Iik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0YWJsZV90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCS8vIGZvbwotCQlUYWJsZSBmb29UYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZENvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpZENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNOdWxsYWJsZSgpKTsgIC8vIGltcGxpZWQgIk5PVCBOVUxMIiA/Ci0KLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIG5hbWVDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIG5hbWVDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygyMCwgbmFtZUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoImJhcl9pZCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJQ29sdW1uIGNodW5rQ29sdW1uID0gYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoImNodW5rIik7Ci0JCWFzc2VydEVxdWFscygiSU1BR0UiLCBjaHVua0NvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNodW5rQ29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0VHJ1ZShjaHVua0NvbHVtbi5pc0xPQigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBjaHVua0NvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gQkFaCi0JCVRhYmxlIGJhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIG5pY2tuYW1lQ29sdW1uID0gYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5pY2tuYW1lIik7Ci0JCWFzc2VydFRydWUobmlja25hbWVDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlDb2x1bW4gc29uZ0NvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJzb25nIik7Ci0JCWFzc2VydEZhbHNlKHNvbmdDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoInNhbGFyeSIpOwotCQlhc3NlcnRGYWxzZShzYWxhcnlDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShzYWxhcnlDb2x1bW4uaXNMT0IoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbk5hbWVkKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGZvb19iYXoiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGJheiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgZm9vIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBiYXIiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0YWJsZV90ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGJhciAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBjaHVuayBpbWFnZSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgZm9vICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgdmFyY2hhcigyMCkgdW5pcXVlLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5pY2tuYW1lIHZhcmNoYXIoMjApIG51bGwsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgc29uZyB2YXJjaGFyKDIwKSBub3QgbnVsbCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBzYWxhcnkgZGVjaW1hbCgxMCwgMikiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgZm9vKGlkKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXpfaWQgaW50ZWdlciByZWZlcmVuY2VzIGJheihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGFibGVfbG9va3VwX3Rlc3QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGFibGVfbG9va3VwX3Rlc3QiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdDEgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIFRFU1QyIChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBbVGVzdDNdIChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGFibGVfbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVOYW1lZCgidGVzdDEiKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVOYW1lZCgiVEVTVDIiKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiVEVTVDIiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJbVGVzdDNdIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBbVGVzdDNdIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBURVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdDEiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0YWJsZV9sb29rdXBfdGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdCIpOwotCi0JCS8vIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChJRCBpbnRlZ2VyLCBOQU1FIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoSWQgaW50ZWdlciwgTmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoW0lkXSBpbnRlZ2VyLCBbTmFtZV0gdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJbSWRdIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIltOYW1lXSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdCIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDEiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHhyZWZfdGVzdDEiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgb3JnIChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBlbXAgKGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdmFyY2hhcigyMCksICIgKwotCQkJCSJvcmdfaWQgaW50ZWdlciByZWZlcmVuY2VzIHhyZWZfdGVzdDEuLm9yZyhpZCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCUNhdGFsb2cgY2F0YWxvZzEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ4cmVmX3Rlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzEpOwotCQlTY2hlbWEgc2NoZW1hMSA9IGNhdGFsb2cxLmdldFNjaGVtYU5hbWVkKCJkYm8iKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIm9yZyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlDYXRhbG9nIGNhdGFsb2cyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgieHJlZl90ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cyKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSBjYXRhbG9nMi5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0JCVRhYmxlIGVtcFRhYmxlID0gc2NoZW1hMi5nZXRUYWJsZU5hbWVkKCJlbXAiKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXBUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbXBUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkgZmsgPSBlbXBUYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZSByZWZUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlZlRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmciLCByZWZUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmsuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY3AgPSBmay5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW4gYmFzZUNvbHVtbiA9IGNwLmdldEJhc2VDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmdfaWQiLCBiYXNlQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiByZWZDb2x1bW4gPSBjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCByZWZDb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgZW1wIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBvcmciKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjM0ZTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJhNjEyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTQxYTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTU1ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6MjY6NTQgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWI5MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBKdWwgMDcgMjA6MTM6MjQgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRhNWI1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMy4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSIyLjQuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iMS4xLjIwMSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8yLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmYxMWY3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRkMWQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSMgIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotIyAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkN2JjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0RWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuSnB0RWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8yLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KcHRFY2xpcHNlTGluazFfMkNvcmVDb250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqIAotICogUmVxdWlyZWQgSmF2YSBzeXN0ZW0gcHJvcGVydHk6Ci0gKiAgICAtRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPTxqcGEuamFyIHBhdGg+Ci0gKiAgICAtRG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXI9PGVjbGlwc2VsaW5rLmphciBwYXRoPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVUZXN0cwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfSkFSX1BST1BFUlRZID0gVGVzdEpwYVByb2plY3QuSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZID0gVGVzdEpwYVByb2plY3QuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkKLQkJaWYocmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rMV8yQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVpcmVkSmFyc0V4aXN0cygpIHsKLQkJcmV0dXJuIGpwYUphclByb3BlcnR5RXhpc3RzKCkKLQkJCSYmIGpwYUphckZpbGVFeGlzdHMoKQotCQkJJiYgZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpCi0JCQkmJiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSkpLmV4aXN0cygpOwotCX0KLQotCS8qKioqKioqKioqKiBwcml2YXRlICoqKioqKioqKiovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpIHsKLQotCQlpZiggISBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JNaXNzaW5nUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSk7Ci0JCX0KLQkJZWxzZSBpZiggISBqcGFKYXJGaWxlRXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpOwotCQl9Ci0JCWVsc2UgaWYoICEgZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JNaXNzaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiOGZhMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjN2I4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQkvLyBkb24ndCBidWlsZCBvcm0ueG1sCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLkZBTFNFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGlua09ybVhtbEZpbGUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfUEFUSCwgZmlsZVBhdGgpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaWZmZXJlbnRseU5hbWVkTWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0yLnhtbCBmaWxlIGJhY2sKLQkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjA0NTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmEuSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQzNTk1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ2FjaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOWNhN2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17CQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaGFyZWRGYWxzZVVuc2V0c090aGVyQ2FjaGVTZXR0aW5ncygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCS8vZXhpc3RlbmNlIGNoZWNraW5nIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXNuJ3QgdW5zZXQgd2hlbiBzaGFyZWQgaXMgc2V0IHRvIGZhbHNlCi0JCWFzc2VydFRydWUoY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IGNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVBbm5vdGF0aW9uLmdldFNoYXJlZCgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLLCBjYWNoZUFubm90YXRpb24uZ2V0VHlwZSgpKTsJCQotCi0JCi0JCS8vc2V0IHNwZWNpZmllZCB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUspOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCi0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLLCBjYWNoZUFubm90YXRpb24uZ2V0VHlwZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVBbm5vdGF0aW9uLmdldEFsd2F5c1JlZnJlc2goKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXREaXNhYmxlSGl0cygpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldERpc2FibGVIaXRzKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNEaXNhYmxlSGl0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsJCQotCi0JCi0JCS8vc2V0IHNwZWNpZmllZCBjb29yZGluYXRpb24gdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsJCQotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKSk7Ci0JCQotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hpbmcuaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQkJZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkKLQotCQotCQkvL3NldCBzcGVjaWZpZWQgY29vcmRpbmF0aW9uIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCi0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJY2FjaGVBbm5vdGF0aW9uLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoNTcpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU3KSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig1OCkpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1OCksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7Ci0JCQotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkobnVsbCk7Ci0JCWNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeHBpcnlVbnNldHNFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQljYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDkwMCkpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDkwMCksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7CQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDkwMCksIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCi0JCWNhY2hlQW5ub3RhdGlvbi5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSB0aW1lT2ZEYXlFeHBpcnkgPSBjYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRpbWVPZkRheUV4cGlyeSwgY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUaW1lT2ZEYXlFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJY2FjaGluZy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRpbWVPZkRheUV4cGlyeVVuc2V0c0V4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMCkpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MDApLCBjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCkpOwkKLQkJCi0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCi0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxMDAsIGNhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBjYWNoZUFubm90YXRpb24uZ2V0U2l6ZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZhNDk4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuTk9fQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5OT19DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydE5hbWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnRBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWVjbGlwc2VMaW5rQ29udmVydC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOwotCQljb252ZXJ0QW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0QW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlck5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJZWNsaXBzZUxpbmtDb252ZXJ0LnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWVjbGlwc2VMaW5rQ29udmVydC5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTdjMzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlckNsYXNzKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlODU4Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0VtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBlbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwM2EwMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IGVudGl0eS5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW50aXR5LmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQkvL1RPRE8gdGVzdCBpbmhlcml0aW5nIGEgZGVmYXVsdCByZWFkb25seSBmcm9tIHlvdSBzdXBlcmNsYXNzCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQkJCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTliMjAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShpZE1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVlMWUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWRhZmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTcyYTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZE9ubHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCS8vVE9ETyB0ZXN0IGluaGVyaXRpbmcgYSBkZWZhdWx0IHJlYWRvbmx5IGZyb20geW91IHN1cGVyY2xhc3MKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCQkKLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1MTJiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIsIGRlZmF1bHRPYmplY3RWYWx1ZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlckNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cImZvb1wiLCBkZWZhdWx0T2JqZWN0VmFsdWU9XCJiYXJcIiwgY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwiZlwiLCBvYmplY3RWYWx1ZT1cImZlbWFsZVwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpLmdldERhdGFUeXBlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0T2JqZWN0VHlwZSgiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpLmdldE9iamVjdFR5cGUoKSk7CQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKCJGIik7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZSgiZmVtYWxlIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlMiA9IGNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnNpb25WYWx1ZTIuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoIm1hbGUiKTsKLQkJCi0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlMyA9IGNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWNvbnZlcnNpb25WYWx1ZTMuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCWNvbnZlcnNpb25WYWx1ZTMuc2V0T2JqZWN0VmFsdWUoIm1hbGUiKTsKLQkJCi0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlMiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlMywgY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCQotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMikuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQkKLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMikuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQkKLQkJY29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwwKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIubW92ZUNvbnZlcnNpb25WYWx1ZSgwLDEpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQkKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPYmplY3RWYWx1ZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmF6Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlckNvbnZlcnNpb25WYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRmOWM2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBQcml2YXRlT3duZWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPCIgKyBUWVBFX05BTUUgKyAiPiBteVR5cGVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb01hbnlNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaXZhdGVPd25lZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBhbm5vdGF0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQzZWFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBteVR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaXZhdGVPd25lZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGF0dHJpYnV0ZXMubmV4dCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBhbm5vdGF0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MThmNjVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyKGNvbnZlcnRlcj1cIkZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyKCkpOwotCi0KLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXIoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXIoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCAoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlckNsYXNzKCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y2YzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1Gb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0KLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldE5hbWUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXREYXRhVHlwZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE9iamVjdFR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRPYmplY3RUeXBlKCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTg1NWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKHZlcnNpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0KLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0KLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb25EYXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSB2ZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1YmY0Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsJCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsJCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NGU5ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmYyNGQ2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgcmVzb3VyY2VCYXNpYyA9IAotCQkJKFhtbEJhc2ljKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIG11dGFibGUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBUT0RPIC0gdGVzdCBkZWZhdWx0cyBmb3IgamF2YSBzZXJpYWxpemFibGUgYW5kIGRhdGUvdGltZSB0eXBlcywgCi0JCS8vIHdpdGggYW5kIHdpdGhvdXQgcGVyc2lzdGVuY2UgcHJvcGVydHkKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgYmFzaWMgbWFwcGluZwotCQkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWNvbnRleHRCYXNpYyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKLQkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCi0JCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQljb250ZXh0QmFzaWMgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWNvbnRleHRCYXNpYyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgcmVzb3VyY2VCYXNpYyA9IAotCQkJKFhtbEJhc2ljKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydCgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQlqYXZhQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSAoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZmM2RjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2U7Ci0JCi0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QgPSBzdXBlci5idWlsZEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQkJCi0JCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcodGVzdEpwYVByb2plY3QpKTsKLQkJb3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gdGVzdEpwYVByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgdGVzdEpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIEVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRFbnRpdHlNYXBwaW5ncygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDM0NzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpOwotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENsYXNzTmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUik7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpOwotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUik7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMGRmNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBqYXZhQ29udGV4dEVtYmVkZGFibGUgPSAoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDdXN0b21pemVyKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vc2V0IHhtbCBjdXN0b21pemVyIG51bGwKLQkJamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDdXN0b21pemVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUNvbnRleHRFbWJlZGRhYmxlID0gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9tQ29udmVydGVycygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZiZTU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvclJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvckNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBqYXZhQ29udGV4dEVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkJCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBqYXZhQ29udGV4dEVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q3VzdG9taXplcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZShudWxsKTsKLQkJamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vc2V0IHhtbCBjdXN0b21pemVyIG51bGwKLQkJamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q3VzdG9taXplcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFDb250ZXh0RW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2hhbmdlVHJhY2tpbmcobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyB1bnNldCBtZXRhZGF0YUNvbXBsZXRlLCBzZXQgeG1sIGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIERFRkVSUkVELCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRUeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgY29vcmRpbmF0aW9uIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY29vcmRpbmF0aW9uIHR5cGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNpemUobmV3IEludGVnZXIoMTA1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZEZhbHNlVW5zZXRzT3RoZXJDYWNoZVNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkKLQkJLy9leGlzdGVuY2UgY2hlY2tpbmcgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBpc24ndCB1bnNldCB3aGVuIHNoYXJlZCBpcyBzZXQgdG8gZmFsc2UKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gb3JtQ29udGV4dENhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgZXhpc3RlbmNlIGNoZWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBleHBpcnksIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RXhwaXJ5KG5ldyBJbnRlZ2VyKDQ1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhwaXJ5LCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldEV4cGlyeShuZXcgSW50ZWdlcig1NSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgZXhwaXJ5IHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RXhwaXJ5KG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4cGlyeSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldEV4cGlyeShuZXcgSW50ZWdlcig2MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNjApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDYwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRFeHBpcnkobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBleHBpcnksIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGltZU9mRGF5KCkpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIobmV3IEludGVnZXIoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4cGlyeSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIobmV3IEludGVnZXIoMTIpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGV4cGlyeSB0byBudWxsLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhwaXJ5LCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuYWRkRXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihuZXcgSW50ZWdlcigxMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGV4cGlyeSB0aW1lIG9mIGRheSBtaW51dGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRNaW51dGUobmV3IEludGVnZXIoMzUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDM1KSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRNaW51dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldE1pbnV0ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGV4cGlyeSB0aW1lIG9mIGRheSBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRmNTc3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQljb250ZXh0SWQgPSAoT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGVEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlEYXRlIik7Ci0JCU9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGNvbnRleHRJZCA9IAotCQkJKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbElkIHJlc291cmNlSWQgPSAKLQkJCShYbWxJZCkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIG11dGFibGUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGlkIG1hcHBpbmcKLQkJCi0JCWphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWNvbnRleHRJZCA9IChPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dElkLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGJhc2ljUmVzb3VyY2UgPSAoWG1sSWQpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nID0gKEphdmFJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBiYXNpY1Jlc291cmNlID0gKFhtbElkKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1JZE1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1JZE1hcHBpbmcuc2V0Q29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOWQzY2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBjb250ZXh0TWFueVRvTWFueSA9IAotCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sTWFueVRvTWFueSByZXNvdXJjZU1hbnlUb01hbnkgPSAKLQkJCShYbWxNYW55VG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb01hbnkuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb01hbnkuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBjb250ZXh0TWFueVRvTWFueSA9IAotCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFueVRvTWFueSA9IAotCQkJKFhtbE1hbnlUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQltYW55VG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBtYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1wbG95ZWUoKTsKLQkJY3JlYXRlVGVzdERlcGFydG1lbnQoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5EZXBhcnRtZW50Iik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnkgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG1hbnlUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiREVQX0VNUCIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFUFRfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGFuZCB2ZXJpZnkgSm9pblRhYmxlIGluZm8gaXMgbm90IHRha2VuIGZyb20gdGhlIGphdmEKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnkgPSAoT3JtT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9NYW55LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X0VtcGxveWVlIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9pZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIGZhbHNlLCBhZGQgbWFwcGluZyB0byBvcm0ueG1sIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCW1hbnlUb01hbnkgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFueVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBtYW55VG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1wbG95ZWVzIik7Ci0JCW1hbnlUb01hbnkgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hbnlUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKLQkJb3JtSm9pblRhYmxlID0gbWFueVRvTWFueS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X0VtcGxveWVlIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2YxOWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSkuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IAotCQkJKFhtbE1hbnlUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gCi0JCQkoWG1sTWFueVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkZldGNoRGVmYXVsdEZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZSA9IChPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJCi0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJbWFueVRvT25lID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgbWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQyNWYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDdXN0b21pemVyKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vc2V0IHhtbCBjdXN0b21pemVyIG51bGwKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDdXN0b21pemVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVFRSSUJVVEUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gREVGRVJSRUQsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFVVE8sIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY2hhbmdlIHRyYWNraW5nLCBzZXQgamF2YSBjaGFuZ2UgdHJhY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyB1bnNldCBtZXRhZGF0YUNvbXBsZXRlLCBzZXQgeG1sIGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRhMTllLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIsIGRlZmF1bHRPYmplY3RWYWx1ZT1cImJhclwiLCBjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWU9XCJmXCIsIG9iamVjdFZhbHVlPVwiZmVtYWxlXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldERhdGFUeXBlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE9iamVjdFR5cGUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBjb252ZXJzaW9uIHZhbHVlIHRvIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoImZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmFkZCgwLCB4bWxDb252ZXJzaW9uVmFsdWUyKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXRPYmplY3RWYWx1ZSgiYmFyMiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJCi0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL3JlbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgbGlzdAotCi0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9jbGVhciB0aGUgY29udmVyc2lvbiB2YWx1ZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBjb252ZXJzaW9uIHZhbHVlIHRvIGphdmEgY29udGV4dCBtb2RlbCwgdmVyaWZ5IGRvZXMgbm90IGFmZmVjdCBvcm0gY29udGV4dCBtb2RlbAotCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoSmF2YUVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGphdmFDb252ZXJzaW9uVmFsdWUgPSBqYXZhQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQlqYXZhQ29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiYmF6Iik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJLy9yZW1vdmUgb3JtIGF0dHJpYnV0ZSBtYXBwaW5nLCB2ZXJpZnkgdmlydHVhbCBtYXBwaW5nIGhhcyBjb252ZXJzaW9uIHZhbHVlcyBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFDb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB2ZXJpZnkgdmlydHVhbCBtYXBwaW5nIGlnbm9yZXMgdGhlIGNvbnZlcnNpb24gdmFsdWVzIGZyb20gamF2YQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gb3JtQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOwotCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZTIgPSBvcm1Db252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL21vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJCi0JCW9ybUNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL3JlbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgY29udGV4dCBtb2RlbCBsaXN0Ci0KLQkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL2NsZWFyIHRoZSBjb252ZXJzaW9uIHZhbHVlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODM0MTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5UYWJsZShuYW1lPVwiREVQX0VNUFwiLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiREVQVF9JRFwiKSwgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJFTVBfSURcIikpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRPbmVUb01hbnkgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKLQkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9uZVRvTWFueSA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsJCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJb25lVG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgYW5kIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwkKLQkJb25lVG9NYW55ID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byBmYWxzZSwgYWRkIG1hcHBpbmcgdG8gb3JtLnhtbCB2ZXJpZnkgSm9pblRhYmxlIGluZm8gaXMgbm90IHRha2VuIGZyb20gdGhlIGphdmEKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlvbmVUb01hbnkgPSAoT3JtT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKLQkJb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbXBsb3llZXMiKTsKLQkJb25lVG9NYW55ID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0UGtNYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YSBjb21wbGV0ZSBhbmQgdmVyaWZ5IHRoYXQgdGhlIG9ybSBtb2RlbCBpZ25vcmVzIHRoZSBqYXZhIGFubm90YXRpb25zCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSAoWG1sT25lVG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSAoWG1sT25lVG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA1M2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3REZXBhcnRtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuT05FX1RPX09ORSkuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEVtcGxveWVlIGVtcGxveWVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKLQkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcHJpdmF0ZSBvd25lZCAgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcHJpdmF0ZSBvd25lZCBiYWNrIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKLQkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldEpvaW5GZXRjaChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKLQkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHRGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1wbG95ZWUoKTsKLQkJY3JlYXRlVGVzdERlcGFydG1lbnQoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5EZXBhcnRtZW50Iik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9uZVRvT25lID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJb25lVG9PbmUgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWFkMTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsJCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpZWxkKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZUZpZWxkcygpLm5leHQoKSwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IHRoZSBwcm9wZXJ0eSBqYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIHVzZWQgaW4gb3JtLgotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsvL2RlZmF1bHQgYWNjZXNzIHdpbGwgYmUgZmllbGQKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmMjBiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDb252ZXJ0ZXIoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJCQkKLQkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJamF2YUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTIyZmY0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zaWVudCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMmRkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCQkJCi0JCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUik7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE9iamVjdFR5cGUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUik7Ci0JCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJamF2YUNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpOwotCQlPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzg5ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgY29udGV4dFZlcnNpb24gPSAKLQkJCShPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFZlcnNpb24gcmVzb3VyY2VWZXJzaW9uID0gCi0JCQkoWG1sVmVyc2lvbikgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQljb250ZXh0VmVyc2lvbiA9IChPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGVEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb25EYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOwotCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAotCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgdmVyc2lvbiBtYXBwaW5nCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQljb250ZXh0VmVyc2lvbiA9IChPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBjb250ZXh0VmVyc2lvbiA9IAotCQkJKE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVmVyc2lvbiByZXNvdXJjZVZlcnNpb24gPSAKLQkJCShYbWxWZXJzaW9uKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gYmFzaWNSZXNvdXJjZSA9IChYbWxWZXJzaW9uKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChKYXZhVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydCgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiBiYXNpY1Jlc291cmNlID0gKFhtbFZlcnNpb24pIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzg5MTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYSgiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhdGFsb2coImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgdGFnIG5vdCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzVlMzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzYyMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsJCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyZWYwZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHN1YmplY3Q7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KHRoaXMuc3ViamVjdCk7Ci0JCXRoaXMucG9wdWxhdGVQdSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5ZGYzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKFRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0KSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gCi0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCQotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5GQUxTRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyByZW1vdmUgZWNsaXBzZWxpbmstb3JtLnhtbAotCQlkZWxldGVSZXNvdXJjZShlY2xpcHNlTGlua09ybVJlc291cmNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5Ci0JCUpwYVhtbFJlc291cmNlIGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQkJCi0JCS8vIGFkZCBzcGVjaWZpZWQgZWNsaXBzZWxpbmstb3JtLnhtbAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMygpIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBpZ25vcmUgaW4gcGVyc2lzdGVuY2UgdW5pdAotCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKS5zZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nRmlsZVJlZnMoKSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IHBlcnNpc3RlbmNlVW5pdC5tYXBwaW5nRmlsZVJlZnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCksIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKS5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSwgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpLmdldFBhcmVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQubWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZmFsc2UpOwkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQkvL3BlcnNpc3RlbnRUeXBlIG5vdCBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sIGFuZCBkaXNjb3ZlckFubm90YXRlZENsYXNzZXMgaXMgZmFsc2UKLQkJLy9zdGlsbCBmaW5kIHRoZSBwZXJzaXN0ZW50VHlwZSBiZWNhdXNlIG9mIGNoYW5nZXMgZm9yIGJ1ZyAxOTAzMTcKLQkJYXNzZXJ0RmFsc2UoZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCwgZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgc2V0IHRvIHRydWUKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7CQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgbGlzdCBhcyBjbGFzcyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZmFsc2UpOwotCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0KLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBmcm9tIG9ybS54bWwgZmlsZSB0aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZSwgcGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0KLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGZyb20gZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIHRoYXQgaXMgaW1wbGllZChub3Qgc3BlY2lmaWVkKSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2MjUwYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmdBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmdBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkYjA1YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRmx1c2hDbGVhckNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXBkYXRlIG9mIG1vZGVsIG9iamVjdHMgYnkgdGhlIENhY2hpbmcgYWRhcHRlciB3aGVuIHRoZQotICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZW50aXRpZXNFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gQ2FjaGVUeXBlLmZ1bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFID0gMTIzNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSA2Nzg5MDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gdHJ1ZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMiA9IENhY2hlVHlwZS5mdWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIgPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9URVNUX1ZBTFVFID0gMTIzNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yID0gNjc4OTA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFID0gRmx1c2hDbGVhckNhY2hlLmRyb3A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGbHVzaENsZWFyQ2FjaGUgRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRV8yID0gRmx1c2hDbGVhckNhY2hlLm1lcmdlOwotCi0JcHVibGljIENhY2hpbmdBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDYWNoaW5nKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGluZy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5FTlRJVElFU19MSVNULCBlbnRpdGllc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNzsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLCBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwgU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU0laRV9LRVksIENBQ0hFX1NJWkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfVFlQRV9LRVksIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0tFWSwgU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwgRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RlbmVycyAqKioqKioqKioqCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMuZW50aXR5Q2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJaW50IG9yaWdpbmFsTnVtYmVyT2ZFbnRpdGllcyA9IHRoaXMuY2FjaGluZy5lbnRpdGllc1NpemUoKTsKLQkJCi0JCXRoaXMuY2FjaGluZy5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCBhZGRlZCIsIHRoaXMuY2FjaGluZy5lbnRpdGllc1NpemUoKSwgb3JpZ2luYWxOdW1iZXJPZkVudGl0aWVzICsgMSk7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUKTsKLQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY2FjaGluZy5yZW1vdmVFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCByZW1vdmVkIiwgdGhpcy5jYWNoaW5nLmVudGl0aWVzU2l6ZSgpLCBvcmlnaW5hbE51bWJlck9mRW50aXRpZXMpOwotCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVR5cGVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVNpemVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKLQkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSwKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVDYWNoaW5nUHJvcGVydHkoCi0JCQlFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSwKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENhY2hlU2l6ZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlIFBVCi0JICogb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIFNoYXJlZENhY2hlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUKLQkgKiBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0hBUkVEX0NBQ0hFX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZLAotCQkJU0hBUkVEX0NBQ0hFX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRmx1c2hDbGVhckNhY2hlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Rmx1c2hDbGVhckNhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUZsdXNoQ2xlYXJDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JCQotCQkvLyBSZXBsYWNlIGJ5IHNldHRpbmcgbW9kZWwgb2JqZWN0Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCBudWxsKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQkJCi0JCS8vIFNldCB0byBudWxsCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCBudWxsKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7Ci0JCQotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy52ZXJpZnlDYWNoaW5nRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoaW5nRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5Q2FjaGluZ0V2ZW50IiwgcHJvcGVydHlOYW1lKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlVHlwZURlZmF1bHQoKENhY2hlVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVEZWZhdWx0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Rmx1c2hDbGVhckNhY2hlKChGbHVzaENsZWFyQ2FjaGUpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCAoQ2FjaGVUeXBlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCAoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldENhY2hpbmdQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZU9mKEVOVElUWV9URVNUKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKEVOVElUWV9URVNUKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldEZsdXNoQ2xlYXJDYWNoZSgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE0YzM2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBDYWNoaW5nVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlcjsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gY2FjaGVUeXBlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYWNoZVR5cGVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2FjaGVUeXBlRXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzaGFyZWRDYWNoZUxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBzaGFyZWRDYWNoZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGNhY2hlVHlwZURlZmF1bHRIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2FjaGVUeXBlRGVmYXVsdEV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzaGFyZWRDYWNoZURlZmF1bHRIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBzaGFyZWRDYWNoZURlZmF1bHRFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS5oYXJkX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS53ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCXB1YmxpYyBDYWNoaW5nVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuc3ViamVjdC5nZXRDYWNoaW5nKCk7IC8vIFN1YmplY3QKLQkJdGhpcy5jYWNoaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPih0aGlzLmNhY2hpbmcpOwotCQkKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlQUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlVHlwZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZUFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlRGVmYXVsdEFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0QUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdENhY2hpbmcgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5jYWNoaW5nOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+IGNhY2hlVHlwZUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4pIHRoaXMuY2FjaGVUeXBlSG9sZGVyOwotCQlhc3NlcnRUcnVlKGNhY2hlVHlwZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpOwotCQkKLQkJY2FjaGVUeXBlQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UoY2FjaGVUeXBlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4gc2hhcmVkQ2FjaGVBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPikgdGhpcy5zaGFyZWRDYWNoZUhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShzaGFyZWRDYWNoZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSk7Ci0JCQotCQlzaGFyZWRDYWNoZUFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShzaGFyZWRDYWNoZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4gY2FjaGVUeXBlRGVmYXVsdEFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4pIHRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShjYWNoZVR5cGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJCi0JCWNhY2hlVHlwZURlZmF1bHRBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShjYWNoZVR5cGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4gc2hhcmVkQ2FjaGVEZWZhdWx0QUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4pIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyOwotCQlhc3NlcnRUcnVlKHNoYXJlZENhY2hlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJCi0JCXNoYXJlZENhY2hlRGVmYXVsdEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShzaGFyZWRDYWNoZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCAKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsIAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGJ1aWxkQ2FjaGVUeXBlQUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlVHlwZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2FjaGVUeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuY2FjaGVUeXBlRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZURlZmF1bHQoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYWNoZVR5cGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlRGVmYXVsdEFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogQmFzaWMgRW50aXR5J3MgUHJvcGVydGllcyBUZXN0cyAqKioqKioqICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5IiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShlbnRpdHksIGVudGl0eS5jbG9uZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJRW50aXR5IGVudGl0eTEgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QSIsIENhY2hlVHlwZS5mdWxsLCAxMDAsIHRydWUpOwotCQlFbnRpdHkgZW50aXR5MiA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlCIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkyKTsKLQkJRW50aXR5IGVudGl0eTMgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QyIsIENhY2hlVHlwZS5mdWxsLCAxMDAsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MSwgZW50aXR5Myk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkyLCBlbnRpdHkzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5Iik7Ci0JCWFzc2VydFRydWUoZW50aXR5LmlzRW1wdHkoKSk7Ci0JCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVPZihlbnRpdHkuZ2V0TmFtZSgpLCAxMDApOwotCQlhc3NlcnRGYWxzZShlbnRpdHkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoRW50aXR5IG9yaWdpbmFsLCBFbnRpdHkgY2xvbmUpIHsKLQkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIG9yaWdpbmFsKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBjbG9uZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5hZGRFbnRpdHkobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUsIENhY2hlVHlwZSBjYWNoZVR5cGUsIEludGVnZXIgc2l6ZSwgQm9vbGVhbiBpc1NoYXJlZCkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5jYWNoaW5nLmFkZEVudGl0eShuYW1lKTsKLQkJdGhpcy5jYWNoaW5nLnNldENhY2hlVHlwZU9mKGVudGl0eS5nZXROYW1lKCksIGNhY2hlVHlwZSk7Ci0JCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVPZihlbnRpdHkuZ2V0TmFtZSgpLCBzaXplKTsKLQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlT2YoZW50aXR5LmdldE5hbWUoKSwgaXNTaGFyZWQpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQkKLQkvKiogKioqKioqIENhY2hpbmcgVGVzdHMgKioqKioqKiAqLwotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgLSBkZWZhdWx0cyBmb3IgZW50aXR5IGxldmVsIGNhY2hpbmcgYXJlIGVxdWFsIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHNldHRpbmdzICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKENBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpLCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZSgpKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAtIGRlZmF1bHRzIGZvciBlbnRpdHkgbGV2ZWwgY2FjaGluZyBhcmUgZXF1YWwgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgc2V0dGluZ3MgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCksIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0U2hhcmVkQ2FjaGUoKSk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUoQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGluZy5ERUZBVUxUX0NBQ0hFX1RZUEVfREVGQVVMVCwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCkpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hpbmcuREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVCwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY2FjaGVUeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlID0gQ2FjaGVUeXBlLmZ1bGw7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLnNldFZhbHVlKG5ld0NhY2hlVHlwZSk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShuZXdDYWNoZVR5cGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRXZlbnQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlICoqKioqKiogKi8KLQkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zaGFyZWRDYWNoZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdTaGFyZWRDYWNoZSA9ICFTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5zZXRWYWx1ZShuZXdTaGFyZWRDYWNoZSk7Ci0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKG5ld1NoYXJlZENhY2hlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRXZlbnQpOwotCQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZURlZmF1bHQgPSBDYWNoZVR5cGUubm9uZTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50KTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3U2hhcmVkQ2FjaGVEZWZhdWx0ID0gIVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgbm90RGVsZXRlZCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIG5vdERlbGV0ZWQpOwotCQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCBub3REZWxldGVkKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlRGVmYXVsdEFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLyoqICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKiogKi8KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShDYWNoZVR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSksIAotCQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIsIAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSksIAotCQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlciwgCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShDYWNoZVR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpLCAKLQkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciwgCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNoYXJlZENhY2hlRGVmYXVsdEFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKSwgCi0JCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciwgCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZGExYmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGRkZTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqICBDb25uZWN0aW9uQWRhcHRlclRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFID0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfVEVTVF9WQUxVRV8yID0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFID0gIlRlc3RfSlRBIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRV8yID0gIlRlc3RfSlRBXzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFID0gIlRlc3RfTm9uX0pUQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFXzIgPSAiVGVzdF9Ob25fSlRBXzIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19OQVRJVkVfU1FMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIgPSAhIE5BVElWRV9TUUxfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1dSSVRJTkdfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIEJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSA9IEJhdGNoV3JpdGluZy5vcmFjbGVfamRiYzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJhdGNoV3JpdGluZyBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMiA9IEJhdGNoV3JpdGluZy5idWZmZXJlZDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yID0gISBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUUgPSAiY29ubmVjdGlvbi5kcml2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFXzIgPSAiY29ubmVjdGlvbi5kcml2ZXIuMiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VU0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRfUEFSQU1FVEVSU19LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUVfMiA9ICEgQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFXzIgPSAhIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NSU5fS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSA9IEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLmFsd2F5czsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRV8yID0gRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuaXNvbGF0ZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFaWV9DT05ORUNUSU9OX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfTEFaWV9DT05ORUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRV8yID0gISBMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAxNjsgLy8gRWNsaXBzZUxpbmsgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTkFUSVZFX1NRTF9LRVksIE5BVElWRV9TUUxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShCQVRDSF9XUklUSU5HX0tFWSwgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX0tFWSwgQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVSTF9LRVksIFVSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVTRVJfS0VZLCBVU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUEFTU1dPUkRfS0VZLCBQQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEJJTkRfUEFSQU1FVEVSU19LRVksIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLCBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZLCBFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExBWllfQ09OTkVDVElPTl9LRVksIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgUFUgZWxlbWVudHMKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0TmF0aXZlU3FsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRCYXRjaFdyaXRpbmcoKEJhdGNoV3JpdGluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0Q2FjaGVTdGF0ZW1lbnRzKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldENhY2hlU3RhdGVtZW50c1NpemUoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXJsKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVzZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFBhc3N3b3JkKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0QmluZFBhcmFtZXRlcnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNNaW4oKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNNYXgoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01pbigoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgoRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0TGF6eUNvbm5lY3Rpb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXROYXRpdmVTcWwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRCYXRjaFdyaXRpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRDYWNoZVN0YXRlbWVudHMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXJsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXNlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRQYXNzd29yZCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0QmluZFBhcmFtZXRlcnMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc01pbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TGF6eUNvbm5lY3Rpb24oKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCS8vICoqKioqKioqKiogTmF0aXZlU3FsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmF0aXZlU3FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCU5BVElWRV9TUUxfS0VZLAotCQkJTkFUSVZFX1NRTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCU5BVElWRV9TUUxfS0VZLAotCQkJTkFUSVZFX1NRTF9URVNUX1ZBTFVFLAotCQkJTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVOYXRpdmVTcWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCU5BVElWRV9TUUxfS0VZLAotCQkJTkFUSVZFX1NRTF9URVNUX1ZBTFVFLAotCQkJTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQmF0Y2hXcml0aW5nIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QmF0Y2hXcml0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUJBVENIX1dSSVRJTkdfS0VZLAotCQkJQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUJBVENIX1dSSVRJTkdfS0VZLAotCQkJQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFLAotCQkJQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVCYXRjaFdyaXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUJBVENIX1dSSVRJTkdfS0VZLAotCQkJQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFLAotCQkJQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVN0YXRlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENhY2hlU3RhdGVtZW50c1NpemUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYWNoZVN0YXRlbWVudHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEcml2ZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXREcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVXJsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUsCi0JCQlVUkxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUsCi0JCQlVUkxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVzZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFLAotCQkJVVNFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSwKLQkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQmluZFBhcmFtZXRlcnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRCaW5kUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlCSU5EX1BBUkFNRVRFUlNfS0VZLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQklORF9QQVJBTUVURVJTX0tFWSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUJpbmRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlCSU5EX1BBUkFNRVRFUlNfS0VZLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUsCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc1NoYXJlZCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc01pbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFJlYWRDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVSZWFkQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc01heCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFJlYWRDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVSZWFkQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNaW4gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXcml0ZUNvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV3JpdGVDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01heCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXcml0ZUNvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVksCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVksCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUUsCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhenlDb25uZWN0aW9uIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TGF6eUNvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTEFaWV9DT05ORUNUSU9OX0tFWSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxBWllfQ09OTkVDVElPTl9LRVksCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMYXp5Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTEFaWV9DT05ORUNUSU9OX0tFWSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWViZTkxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25uZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNWYzNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGhyb3dFeGNlcHRpb25zTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHRocm93RXhjZXB0aW9uc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImFjbWUuc2Vzc2lvbnMuQ3VzdG9taXplciI7Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q3VzdG9taXphdGlvbigpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPih0aGlzLmN1c3RvbWl6YXRpb24pOwotCQkKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQUEoY3VzdG9taXphdGlvbkhvbGRlcik7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIpOwotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RDdXN0b21pemF0aW9uID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuY3VzdG9taXphdGlvbjsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KSB0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZSh0aHJvd0V4Y2VwdGlvbnNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q3VzdG9taXphdGlvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKTsKLQkJCi0JCXRocm93RXhjZXB0aW9uc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRocm93RXhjZXB0aW9uc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdEN1c3RvbWl6YXRpb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRocm93RXhjZXB0aW9uc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLCAKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbjsKLQl9Ci0KLQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKioKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyb3dFeGNlcHRpb25zQUEoUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRocm93RXhjZXB0aW9ucyhlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRocm93RXhjZXB0aW9uc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIEJhc2ljIEVudGl0eSdzIFByb3BlcnRpZXMgVGVzdHMgKioqKioqKiAqLwotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eSIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShlbnRpdHksIGVudGl0eS5jbG9uZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJRW50aXR5IGVudGl0eTEgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QSIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCUVudGl0eSBlbnRpdHkyID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUIiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MSwgZW50aXR5Mik7Ci0JCUVudGl0eSBlbnRpdHkzID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUMiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MSwgZW50aXR5Myk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkyLCBlbnRpdHkzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5Iik7Ci0JCWFzc2VydFRydWUoZW50aXR5LmlzRW1wdHkoKSk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eS5nZXROYW1lKCksIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShFbnRpdHkgb3JpZ2luYWwsIEVudGl0eSBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgb3JpZ2luYWwpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIGNsb25lKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSwgU3RyaW5nIGFDbGFzc05hbWUpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuY3VzdG9taXphdGlvbi5hZGRFbnRpdHkobmFtZSk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eS5nZXROYW1lKCksIGFDbGFzc05hbWUpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqIAotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUoVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEN1c3RvbWl6YXRpb24uREVGQVVMVF9USFJPV19FWENFUFRJT05TLCB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqIAotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3VGhyb3dFeGNlcHRpb25zID0gIVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuc2V0VmFsdWUobmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJdGhpcy52ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKG5ld1Rocm93RXhjZXB0aW9ucyk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKioKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywgbm90RGVsZXRlZCk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5nZXRUaHJvd0V4Y2VwdGlvbnMoKSwgCi0JCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciwgCi0JCQlDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0MzkxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uUHJvZmlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBDdXN0b21pemF0aW9uIGFkYXB0ZXIgd2hlbiB0aGUKLSAqIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbjsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBlbnRpdGllc0V2ZW50OwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHNlc3Npb25DdXN0b21pemVyc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFU1QgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUXzIgPSAiQWRkcmVzcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV19FWENFUFRJT05TX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRV8yID0gISBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0xBWllfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0xBWlk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0ZFVENIX0dST1VQU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMiA9ICEgV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfSU5URVJOQUxfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfRUFHRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMiA9ICEgV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9PTkxZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRV8yID0gISBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1NDSEVNQV9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRV8yID0gISBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImphdmEubGFuZy5TdHJpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yID0gImphdmEubGFuZy5Cb29sZWFuIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2VhdmluZyBXRUFWSU5HX1RFU1RfVkFMVUUgPSBXZWF2aW5nLmZhbHNlXzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFXzIgPSBXZWF2aW5nLnN0YXRpY187Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImFjbWUuc2Vzc2lvbnMuRGVzY3JpcHRvckN1c3RvbWl6ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRV8yID0gImFjbWUuc2Vzc2lvbnMuQ3VzdG9taXplciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19QUk9GSUxFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9maWxlciBQUk9GSUxFUl9URVNUX1ZBTFVFID0gUHJvZmlsZXIucXVlcnlfbW9uaXRvcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVJfVEVTVF9WQUxVRV8yID0gImN1c3RvbS5wcm9maWxlci50ZXN0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUgPSAiYWNtZS5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yID0gIm9yYWNsZS5zZXNzaW9ucy5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDdXN0b21pemF0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9MSVNULCBzZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5FTlRJVElFU19MSVNULCBlbnRpdGllc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAxMzsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUSFJPV19FWENFUFRJT05TX0tFWSwgVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfTEFaWV9LRVksIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwgV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19JTlRFUk5BTF9LRVksIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0VBR0VSX0tFWSwgV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fT05MWV9LRVksIFZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRFX1NDSEVNQV9LRVksIFZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fQ1VTVE9NSVpFUl9LRVksIFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfS0VZLCBXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENVU1RPTUlaRVJfS0VZLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBST0ZJTEVSX0tFWSwgUFJPRklMRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVhDRVBUSU9OX0hBTkRMRVJfS0VZLCBFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5lbnRpdHlDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7Ci0JCXN1cGVyLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5lbnRpdGllc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBzZXNzaW9uQ3VzdG9taXplckNoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFRocm93RXhjZXB0aW9ucygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nTGF6eSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdDaGFuZ2VUcmFja2luZygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdGZXRjaEdyb3VwcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0ludGVybmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nRWFnZXIoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGlvbk9ubHkoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGVTY2hlbWEoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRFeGNlcHRpb25IYW5kbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZygoV2VhdmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQlpZiAobmV3VmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKLQkJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0UHJvZmlsZXIoKFByb2ZpbGVyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0xhenkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdJbnRlcm5hbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdFYWdlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFZhbGlkYXRlU2NoZW1hKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0UHJvZmlsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5jdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVycygpOwotCQkJaWYoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJbW9kZWxWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKEVOVElUWV9URVNUKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihQUk9GSUxFUl9URVNUX1ZBTFVFKSA6IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkJCWV4cGVjdGVkVmFsdWU7Ci0JCX0KLQkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpOwotCQkKLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzZXNzaW9uQ3VzdG9taXplcnMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNlc3Npb25DdXN0b21pemVyc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gYWRkCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5jdXN0b21pemF0aW9uLmFkZFNlc3Npb25DdXN0b21pemVyKFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JCQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJvd0V4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRocm93RXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nTGF6eSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0xBWllfS0VZLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0xhenkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0NoYW5nZVRyYWNraW5nIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRmV0Y2hHcm91cHMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nRmV0Y2hHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ZldGNoR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdJbnRlcm5hbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ludGVybmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdFYWdlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdFYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0VhZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25DdXN0b21pemVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmcgdGVzdHMgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgV2VhdmluZyBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbk9ubHkgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Pbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRlU2NoZW1hIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVZBTElEQVRFX1NDSEVNQV9LRVksCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjZXB0aW9uSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX0tFWSwKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25IYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6YXRpb24gY2xhc3MgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ3VzdG9taXphdGlvbiBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ1VTVE9NSVpFUl9LRVksCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ3VzdG9taXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9maWxlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb2ZpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFBST0ZJTEVSX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCS8vIHZlcmlmeSBzZXQgZW51bSB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUFJPRklMRVJfS0VZLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUVfMik7Ci0JCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvZmlsZXIoCi0JCQlQUk9GSUxFUl9LRVksCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvZmlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUUsCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBwcm9maWxlciBhbmQgbGl0ZXJhbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvZmlsZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gcHJvZmlsZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoUHJvZmlsZXIpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoUHJvZmlsZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0KLQotCi0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvLyAqKioqKioqKioqIHZlcmlmeSBTZXNzaW9uQ3VzdG9taXplciBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCi0JCXRoaXMucHJvcGVydGllc1RvdGFsKys7Ci0JCXRoaXMudmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSwgKFN0cmluZykgdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEsIHRydWUpOyAKLQkJdGhpcy52ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKLQkJdGhpcy52ZXJpZnlTZXNzaW9uQ3VzdG9taXplckV2ZW50KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2Vzc2lvbkN1c3RvbWl6ZXJFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24pIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0U291cmNlKCk7Ci0JCWFzc2VydFRydWUoY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cygoU3RyaW5nKSBleHBlY3RlZFZhbHVlKSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogdmVyaWZ5IGVudGl0eSBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUyKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5Ci0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KHByb3BlcnR5TmFtZSwgZW50aXR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeUN1c3RvbWl6YXRpb25FdmVudCIsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q3VzdG9taXphdGlvblByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODJjNjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjljOGVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWwuR2VuZXJhbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogIEdlbmVyYWxBZGFwdGVyVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydGllczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSA9IEdlbmVyYWxQcm9wZXJ0aWVzLkVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUVfMiA9ICEgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRTsKLQotCQotCXB1YmxpYyBHZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzID0gdGhpcy5zdWJqZWN0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDI7IC8vIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLCBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCi0JCXJldHVybjsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUsCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUsCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCi0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5nZW5lcmFsUHJvcGVydGllcy5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSkKLQkJCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmNjMDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBHZW5lcmFsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydHk7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnR5ID0gdGhpcy5zdWJqZWN0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPiBnZW5lcmFsUHJvcGVydHlIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPih0aGlzLmdlbmVyYWxQcm9wZXJ0eSk7Ci0JCQotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciA9IHRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShnZW5lcmFsUHJvcGVydHlIb2xkZXIpOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyID0gdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyKTsKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0R2VuZXJhbFByb3BlcnR5ID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuZ2VuZXJhbFByb3BlcnR5OyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPikgdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXI7Ci0JCWFzc2VydFRydWUoZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdEdlbmVyYWxQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpOwotCQkKLQkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0R2VuZXJhbFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnR5OwotCX0KLQotCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMudGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtICoqKioqKiogCi0JCXRoaXMudmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkRFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIHRoaXMuZ2VuZXJhbFByb3BlcnR5LmdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKiAKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSA9ICFFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlci5zZXRWYWx1ZShuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmdlbmVyYWxQcm9wZXJ0eS5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSwgCi0JCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciwgCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhODQ4My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUdlbmVyYWxUZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkYzdlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9nZ2luZ0FkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWNhMTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dpbmdBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIExFVkVMX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBMRVZFTF9URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRV8yID0gISBUSU1FU1RBTVBfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX1RIUkVBRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhSRUFEX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhSRUFEX1RFU1RfVkFMVUVfMiA9ICEgVEhSRUFEX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfU0VTU0lPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0VTU0lPTl9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNFU1NJT05fVEVTVF9WQUxVRV8yID0gISBTRVNTSU9OX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05TX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfRVhDRVBUSU9OUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0VQVElPTlNfVEVTVF9WQUxVRV8yID0gISBFWENFUFRJT05TX1RFU1RfVkFMVUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSA9ICJDOi90ZW1wIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yID0gIkM6L3RtcCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTE9HR0VSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVJfVEVTVF9WQUxVRSA9IExvZ2dlci5qYXZhX2xvZ2dlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20ubG9nZ2VyLnRlc3QiOwotCQotCXB1YmxpYyBMb2dnaW5nQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubG9nZ2luZyA9IHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkxFVkVMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRJTUVTVEFNUF9LRVksIFRJTUVTVEFNUF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFVkVMX0tFWSwgTEVWRUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEhSRUFEX0tFWSwgVEhSRUFEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9LRVksIFNFU1NJT05fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFWENFUFRJT05TX0tFWSwgRVhDRVBUSU9OU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExPR19GSUxFX0xPQ0FUSU9OX0tFWSwgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9HR0VSX0tFWSwgTE9HR0VSX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMRVZFTF9LRVksCi0JCQlMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxFVkVMX0tFWSwKLQkJCUxFVkVMX1RFU1RfVkFMVUUsCi0JCQlMRVZFTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTEVWRUxfS0VZLAotCQkJTEVWRUxfVEVTVF9WQUxVRSwKLQkJCUxFVkVMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaW1lc3RhbXAgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRJTUVTVEFNUF9LRVksCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRJTUVTVEFNUF9LRVksCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGhyZWFkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUSFJFQURfS0VZLAotCQkJVEhSRUFEX1RFU1RfVkFMVUUsCi0JCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlUSFJFQURfS0VZLAotCQkJVEhSRUFEX1RFU1RfVkFMVUUsCi0JCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb24gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0tFWSwKLQkJCVNFU1NJT05fVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVYQ0VQVElPTlNfS0VZLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0VQVElPTlNfS0VZLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMb2dGaWxlTG9jYXRpb24gKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fS0VZLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nRmlsZUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RW1wdHlGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHB1S2V5ID0gTE9HX0ZJTEVfTE9DQVRJT05fS0VZOwotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFNldCBGaWxlTG9jYXRpb24gdG8gIiIgJiB2ZXJpZnkgdGhhdCB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkocHVLZXksICAicGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMgZG9lc24ndCBjb250YWluczogIik7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCAiIik7Ci0KLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KHB1S2V5LCAgIlByb3BlcnR5IHdhcyBub3QgZGVsZXRlZCIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIExvZ2dlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExvZ2dlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0dHRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoTE9HR0VSX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCS8vIHZlcmlmeSBzZXQgZW51bSB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTE9HR0VSX0tFWSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFLAotCQkJTE9HR0VSX1RFU1RfVkFMVUVfMik7Ci0JCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0TG9nZ2VyKAotCQkJTE9HR0VSX0tFWSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFLAotCQkJTE9HR0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxvZ2dlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTE9HR0VSX0tFWSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFLAotCQkJTE9HR0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIGxvZ2dlciBhbmQgbGl0ZXJhbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0TG9nZ2VyKFN0cmluZyBlbEtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldE1vZGVsKCkucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKLQkJLy8gdGVzdCBzZXQgY3VzdG9tIGxvZ2dlci4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChMb2dnZXIpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKExvZ2dlcikgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChTdHJpbmcpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MRVZFTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0TGV2ZWwoKExvZ2dpbmdMZXZlbCkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRUaW1lc3RhbXAoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0VGhyZWFkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRTZXNzaW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRFeGNlcHRpb25zKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0TG9nRmlsZUxvY2F0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpIHsKLQkJCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKExvZ2dlcikgbmV3VmFsdWUpOwotCQkJZWxzZQotCQkJCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxFVkVMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0TGV2ZWwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldFRpbWVzdGFtcCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0VGhyZWFkKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0U2Vzc2lvbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldEV4Y2VwdGlvbnMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMb2dnZXIoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkgewotCQkJCi0JCQlleHBlY3RlZFZhbHVlXyA9IChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoTE9HR0VSX1RFU1RfVkFMVUUpIDogLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCQkJZXhwZWN0ZWRWYWx1ZTsKLQkJfQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQ5MzY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGltZXN0YW1wSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0aW1lc3RhbXBMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgdGltZXN0YW1wRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVElNRVNUQU1QX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4gbG9nZ2luZ0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4odGhpcy5sb2dnaW5nKTsKLQkJCi0JCXRoaXMudGltZXN0YW1wSG9sZGVyID0gdGhpcy5idWlsZFRpbWVzdGFtcEFBKGxvZ2dpbmdIb2xkZXIpOwotCQl0aGlzLnRpbWVzdGFtcExpc3RlbmVyID0gdGhpcy5idWlsZFRpbWVzdGFtcENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGltZXN0YW1wSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRpbWVzdGFtcExpc3RlbmVyKTsKLQkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0TG9nZ2luZyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmxvZ2dpbmc7IC8vIFN1YmplY3QKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPiB0aW1lc3RhbXBBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPikgdGhpcy50aW1lc3RhbXBIb2xkZXI7Ci0JCWFzc2VydFRydWUodGltZXN0YW1wQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdExvZ2dpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKTsKLQkJCi0JCXRpbWVzdGFtcEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRpbWVzdGFtcExpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdExvZ2dpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGltZXN0YW1wQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZXN0YW1wQUEoUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaW1lc3RhbXAoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGltZXN0YW1wKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGltZXN0YW1wQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMudGltZXN0YW1wRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqIAotCQl0aGlzLnZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoTG9nZ2luZy5ERUZBVUxUX1RJTUVTVEFNUCwgdGhpcy5sb2dnaW5nLmdldERlZmF1bHRUaW1lc3RhbXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKLQkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMudGltZXN0YW1wSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1RpbWVzdGFtcCA9ICFUSU1FU1RBTVBfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobmV3VGltZXN0YW1wKTsKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG5ld1RpbWVzdGFtcCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aW1lc3RhbXBFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKLQkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRpbWVzdGFtcEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5sb2dnaW5nLmdldFRpbWVzdGFtcCgpLCAKLQkJCXRoaXMudGltZXN0YW1wSG9sZGVyLCAKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UyMWRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4NTBiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0RGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXBkYXRlIG9mIG1vZGVsIG9iamVjdHMgYnkgdGhlIE9wdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSA9ICJzZXNzaW9uLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbi1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSA9ICJzZXNzaW9ucy14bWwudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbnMteG1sLTIudGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfREFUQUJBU0VfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXREYXRhYmFzZSBUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSA9IFRhcmdldERhdGFiYXNlLmNsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0RGF0YWJhc2UudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFyZ2V0U2VydmVyIFRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSA9IFRhcmdldFNlcnZlci53ZWJsb2dpY185OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0U2VydmVyLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUVfMiA9ICEgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSA9ICJhY21lLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUE9SQUxfTVVUQUJMRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yID0gISBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgT3B0aW9uc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9OQU1FX0tFWSwgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05TX1hNTF9LRVksIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEFSR0VUX0RBVEFCQVNFX0tFWSwgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRBUkdFVF9TRVJWRVJfS0VZLCBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLCBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRFTVBPUkFMX01VVEFCTEVfS0VZLCBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVNTSU9OX05BTUVfS0VZLAotCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTlNfWE1MX0tFWSwKLQkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25zWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRUYXJnZXREYXRhYmFzZSgKLQkJCVRBUkdFVF9EQVRBQkFTRV9LRVksCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIHRhcmdldERhdGFiYXNlIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChUYXJnZXREYXRhYmFzZSkgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVGFyZ2V0U2VydmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFRhcmdldFNlcnZlcigKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgYW5kIGxpdGVyYWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFRhcmdldFNlcnZlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoVGFyZ2V0U2VydmVyKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRlbXBvcmFsTXV0YWJsZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGVtcG9yYWxNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFNlc3Npb25zWG1sKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VQcm9wZXJ0eShuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyUHJvcGVydHkobmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0RXZlbnRMaXN0ZW5lcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRUZW1wb3JhbE11dGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlUHJvcGVydHkoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJQcm9wZXJ0eShPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFNlc3Npb25zWG1sKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFRhcmdldFNlcnZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB8fAotCQkJcHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gdGhpcy5jb252ZXJ0VG9FY2xpcHNlTGlua1N0cmluZ1ZhbHVlKGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZShPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZykgKChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlKTsgLy8gYWxyZWFkeSBhIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZiOGEyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcHRpb25zID0gdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4odGhpcy5vcHRpb25zKTsKLQkJCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKG9wdGlvbnNIb2xkZXIpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0T3B0aW9ucyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLm9wdGlvbnM7IC8vIFN1YmplY3QKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPiBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPikgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXI7Ci0JCWFzc2VydFRydWUoaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7Ci0JCQotCQlpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RPcHRpb25zLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQShQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlPcHRpb25zVmFsdWVNb2RlbFRlc3RzLnRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUoSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhPcHRpb25zLkRFRkFVTFRfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgdGhpcy5vcHRpb25zLmdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKiAKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9ICFJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlci5zZXRWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5vcHRpb25zLmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpLCAKLQkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCAKLQkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWU2YzU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjFkZjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFID0gT3V0cHV0TW9kZS5zcWxfc2NyaXB0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIgPSBPdXRwdXRNb2RlLmRhdGFiYXNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiY3JlYXRlLWZpbGUtbmFtZS50ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIgPSAiY3JlYXRlLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiZHJvcC1maWxlLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMiA9ICJkcm9wLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT047Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUgPSAiQzovdGVtcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMiA9ICJDOi90bXAiOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDk7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShPVVRQVVRfTU9ERV9LRVksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShERExfR0VORVJBVElPTl9UWVBFX0tFWSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ1JFQVRFX0ZJTEVfTkFNRV9LRVksIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJPUF9GSUxFX05BTUVfS0VZLCBEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBDcmVhdGVGaWxlTmFtZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDcmVhdGVGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENyZWF0ZUZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDcmVhdGVGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRHJvcEZpbGVOYW1lICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERyb3BGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldERyb3BGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUk9QX0ZJTEVfTkFNRV9LRVksCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcm9wRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwgCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBBcHBsaWNhdGlvbkxvY2F0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIEFwcGxpY2F0aW9uTG9jYXRpb24gcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24KLQkgKiBhZGFwdGVyIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHB1S2V5ID0gQVBQTElDQVRJT05fTE9DQVRJT05fS0VZOwotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFNldCBBcHBsaWNhdGlvbkxvY2F0aW9uIHRvICIiICYgdmVyaWZ5IHRoYXQgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KHB1S2V5LCAgInBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzIGRvZXNuJ3QgY29udGFpbnM6ICIpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgIiIpOwotCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShwdUtleSwgICJQcm9wZXJ0eSB3YXMgbm90IGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldE91dHB1dE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJT1VUUFVUX01PREVfS0VZLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlPVVRQVVRfTU9ERV9LRVksCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlT3V0cHV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJT1VUUFVUX01PREVfS0VZLCAKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERkbEdlbmVyYXRpb25UeXBlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCi0JICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGRsR2VuZXJhdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURkbEdlbmVyYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwgCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsIAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKChPdXRwdXRNb2RlKSBuZXdWYWx1ZSk7Ci0JCS8vIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCS8vIFRPRE8KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERkbEdlbmVyYXRpb25UeXBlKChEZGxHZW5lcmF0aW9uVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldEFwcGxpY2F0aW9uTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0Q3JlYXRlRmlsZU5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERyb3BGaWxlTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRDcmVhdGVGaWxlTmFtZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXREcm9wRmlsZU5hbWUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhYWIxMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBvdXRwdXRNb2RlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZGxHZW5UeXBlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDY7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMjsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoZGRsR2VuVHlwZUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiogKioqKioqIHRlc3QgbWV0aG9kcyAqKioqKioqICovCi0KLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotCSAqIHdoZW4gdGhlIFBVIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dE1vZGVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIpOwotCQlMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4ocHJvcGVydGllc0FkYXB0ZXIsIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSk7Ci0JCQotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkKLQkJLy8gQmFzaWMKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFHZW5lcmF0aW9uLml0ZW1Jc1Byb3BlcnR5KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSkpKTsKLQkJYXNzZXJ0RXF1YWxzKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob3V0cHV0TW9kZUtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBPdXRwdXRNb2RlCi0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZSBhZ2FpbgotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PihzdWJqZWN0SG9sZGVyLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJvcGVydGllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcm9wZXJ0aWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2YWI5Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cwotICogCi0gKiBUZXN0cyB0aGUgUHJvcGVydHlWYWx1ZU1vZGVsIG9mIFNjaGVtYUdlbmVyYXRpb24gbW9kZWwgYW5kIHRoZSB1cGRhdGUgb2YgdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW47Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEZGxHZW5lcmF0aW9uVHlwZT4gZGRsR2VuZXJhdGlvblR5cGVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGRkbEdlbmVyYXRpb25UeXBlRXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE91dHB1dE1vZGU+IG91dHB1dE1vZGVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IG91dHB1dE1vZGVFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFID0gRGRsR2VuZXJhdGlvblR5cGUuZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgT1VUUFVUX01PREVfVEVTVF9WQUxVRSA9IE91dHB1dE1vZGUuc3FsX3NjcmlwdDsKLQotCXB1YmxpYyBTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2NoZW1hR2VuID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsgLy8gU3ViamVjdAotCQl0aGlzLnNjaGVtYUdlbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4odGhpcy5zY2hlbWFHZW4pOwotCQkKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlciA9IHRoaXMuYnVpbGREZGxHZW5lcmF0aW9uVHlwZUFBKHRoaXMuc2NoZW1hR2VuSG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBkZGxHZW5lcmF0aW9uVHlwZUxpc3RlbmVyID0gdGhpcy5idWlsZERkbEdlbmVyYXRpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZGRsR2VuZXJhdGlvblR5cGVMaXN0ZW5lcik7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIgPSB0aGlzLmJ1aWxkT3V0cHV0TW9kZUFBKHRoaXMuc2NoZW1hR2VuSG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvdXRwdXRNb2RlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkT3V0cHV0TW9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMub3V0cHV0TW9kZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgb3V0cHV0TW9kZUxpc3RlbmVyKTsKLQkJdGhpcy5vdXRwdXRNb2RlRXZlbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW47Ci0JfQotCi0JLyoqICoqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEZGxHZW5lcmF0aW9uVHlwZT4gYnVpbGREZGxHZW5lcmF0aW9uVHlwZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPihzdWJqZWN0SG9sZGVyLCBTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oRGRsR2VuZXJhdGlvblR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldERkbEdlbmVyYXRpb25UeXBlKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3V0cHV0TW9kZT4gYnVpbGRPdXRwdXRNb2RlQUEoUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4oc3ViamVjdEhvbGRlciwgU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE91dHB1dE1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT3V0cHV0TW9kZSBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0T3V0cHV0TW9kZShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE91dHB1dE1vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5vdXRwdXRNb2RlRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLyoqICoqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5RGRsR2VuZXJhdGlvblR5cGVBQVZhbHVlKERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9ERExfR0VORVJBVElPTl9UWVBFLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCkpOwotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQl0aGlzLnNjaGVtYUdlbi5nZXREZWZhdWx0T3V0cHV0TW9kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLyoqICoqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqICovCi0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG5ld0RkbEdlbmVyYXRpb25UeXBlID0gRGRsR2VuZXJhdGlvblR5cGUuY3JlYXRlX3RhYmxlczsKLQkJLy8gTW9kaWZ5IHRoZSBwZXJzaXN0ZW5jZVVuaXQgZGlyZWN0bHkKLQkJdGhpcy5zdWJqZWN0LnNldFByb3BlcnR5KAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3RGRsR2VuZXJhdGlvblR5cGUpLAotCQkJZmFsc2UpOwotCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShuZXdEZGxHZW5lcmF0aW9uVHlwZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50KTsKLQkJCi0JCS8qKiAqKioqKiogT3V0cHV0TW9kZSAqKioqKioqICovCi0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5vdXRwdXRNb2RlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlPdXRwdXRNb2RlIG5ld091dHB1dE1vZGUgPSBPdXRwdXRNb2RlLmRhdGFiYXNlOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuc2V0VmFsdWUobmV3T3V0cHV0TW9kZSk7Ci0JCXRoaXMudmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUobmV3T3V0cHV0TW9kZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5vdXRwdXRNb2RlRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwZXJzaXN0ZW5jZVVuaXQgZGlyZWN0bHkKLQkJdGhpcy5zdWJqZWN0LnNldFByb3BlcnR5KFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwgbnVsbCwgZmFsc2UpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUpOwotCQlhc3NlcnROdWxsKHByb3BlcnR5KTsKLQkJCi0JCS8qKiAqKioqKiogT3V0cHV0TW9kZSAqKioqKioqICovCi0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMub3V0cHV0TW9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLm91dHB1dE1vZGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQlwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7Ci0JCWFzc2VydE51bGwocHJvcGVydHkpOwotCX0KLQotCS8qKiAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqICovCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShEZGxHZW5lcmF0aW9uVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGRsR2VuZXJhdGlvblR5cGUoKSwKLQkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIsCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShPdXRwdXRNb2RlIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsCi0JCQl0aGlzLnNjaGVtYUdlbi5nZXRPdXRwdXRNb2RlKCksCi0JCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIsCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0RWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzJmOWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DYWNoZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2NTZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DYWNoZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hlVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIENhY2hlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5DQUNIRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKHR5cGUgPSBDYWNoZVR5cGUuU09GVCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShzaXplID0gNTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnkgPSA1MCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShzaGFyZWQ9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGFsd2F5c1JlZnJlc2g9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKHJlZnJlc2hPbmx5SWZOZXdlcj10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShkaXNhYmxlSGl0cz10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZ1dpdGhDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShjb29yZGluYXRpb25UeXBlID0gQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhDYWNoZVR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZVR5cGUuU09GVCwgY2FjaGUuZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ2FjaGVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKENhY2hlVHlwZS5XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlVHlwZS5XRUFLLCBjYWNoZS5nZXRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSh0eXBlID0gV0VBSykiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHR5cGUgPSBXRUFLKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwKSwgY2FjaGUuZ2V0U2l6ZSgpKTsKLQkJCi0JCWNhY2hlLnNldFNpemUoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCBjYWNoZS5nZXRTaXplKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShzaXplID0gODApIiwgY3UpOwotCQkKLQkJY2FjaGUuc2V0U2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRTaXplKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihzaXplID0gODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQkJCi0JCWNhY2hlLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoc2hhcmVkPWZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCQkKLQkJY2FjaGUuc2V0U2hhcmVkKG51bGwpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwKSwgY2FjaGUuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJY2FjaGUuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgY2FjaGUuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShleHBpcnkgPSA4MCkiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRFeHBpcnkobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGUuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihleHBpcnkgPSA4MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnROb3ROdWxsKHRpbWVPZkRheSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQotCQljYWNoZS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWNhY2hlLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShhbHdheXNSZWZyZXNoPWZhbHNlKSIsIGN1KTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWx3YXlzUmVmcmVzaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEFsd2F5c1JlZnJlc2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQljYWNoZS5zZXRBbHdheXNSZWZyZXNoKG51bGwpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJY2FjaGUuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShyZWZyZXNoT25seUlmTmV3ZXI9ZmFsc2UpIiwgY3UpOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmcmVzaE9ubHlJZk5ld2VyTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7CQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKLQkJCi0JCWNhY2hlLnNldERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGRpc2FibGVIaXRzPWZhbHNlKSIsIGN1KTsJCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERpc2FibGVIaXRzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQkKLQkJY2FjaGUuc2V0RGlzYWJsZUhpdHMobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aENvb3JkaW5hdGlvblR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aENvb3JkaW5hdGlvblR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoZS5zZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGNvb3JkaW5hdGlvblR5cGUgPSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUykiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGNvb3JkaW5hdGlvblR5cGUgPSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUykiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlYzE4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYW5nZVRyYWNraW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIENoYW5nZVRyYWNraW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDaGFuZ2VUcmFja2luZyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDaGFuZ2VUcmFja2luZ1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENoYW5nZVRyYWNraW5nKENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQlhc3NlcnROb3ROdWxsKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDaGFuZ2VUcmFja2luZ1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2hhbmdlVHJhY2tpbmcoQVRUUklCVVRFKSIsIGN1KTsKLQkJCi0JCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihBVFRSSUJVVEUpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENoYW5nZVRyYWNraW5nIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENoYW5nZVRyYWNraW5nKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDBlMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0RGF0YVZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZPT1wiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRk9PXCIpKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5zZXREYXRhVmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZSkiLCBjdSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldE9iamVjdFZhbHVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUpIiwgY3UpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGM5NDA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbnZlcnRBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDb252ZXJ0QW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydGVyV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydCh2YWx1ZT1cIm15Q29udmVydGVyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0LmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0KHZhbHVlPVwiQmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1NzM4OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQ29udmVydGVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydGVyV2l0aENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9Rm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyKG5hbWU9XCJiYXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aENvbnZlcnRlckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9QmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aENvbnZlcnRlckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb252ZXJ0ZXJDbGFzcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIobmFtZT1cImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmFtZT0iLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0N1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjQzOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0N1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDdXN0b21pemVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIoRm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRWYWx1ZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDdXN0b21pemVyKEJhci5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEN1c3RvbWl6ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28uY2xhc3MiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWZjZDYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi17CQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYUFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MTQyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoUHJpbWFyeUtleUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoUHJpbWFyeUtleUFubm90YXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFkNTM1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEV4aXN0ZW5jZUNoZWNraW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEV4aXN0ZW5jZUNoZWNraW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFeGlzdGVuY2VDaGVja2luZyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZ1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HLCBFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlhc3NlcnROb3ROdWxsKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZ1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUoRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARXhpc3RlbmNlQ2hlY2tpbmcoQVNTVU1FX05PTl9FWElTVEVOQ0UpIiwgY3UpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKEFTU1VNRV9OT05fRVhJU1RFTkNFKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFeGlzdGVuY2VDaGVja2luZyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFeGlzdGVuY2VDaGVja2luZygiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhMDg4MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKb2luRmV0Y2hUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSm9pbkZldGNoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5PVVRFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0Tm90TnVsbChqb2luRmV0Y2gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCWFzc2VydEVxdWFscyhKb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luRmV0Y2hXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkZldGNoKElOTkVSKSIsIGN1KTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKElOTkVSKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luRmV0Y2giLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkZldGNoKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyNzUyMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhbmdlVHJhY2tpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVydEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5GZXRjaFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE11dGFibGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpdmF0ZU93bmVkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRpbWVPZkRheVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjMjRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE11dGFibGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBNdXRhYmxlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE11dGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE11dGFibGUodmFsdWU9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCi0JCi0JcHVibGljIHZvaWQgdGVzdE11dGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUodmFsdWU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUoZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdXRhYmxlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidmFsdWUiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkZGJhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkZWZhdWx0T2JqZWN0VmFsdWUgPSBcImZcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1CYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJpbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1pbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJkYXRhVHlwZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1CYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1pbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib2JqZWN0VHlwZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmFtZT0iLCBjdSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRlZmF1bHRPYmplY3RWYWx1ZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJkZWZhdWx0T2JqZWN0VmFsdWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvblZhbHVlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0KLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRUcnVlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUgPSBjb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiYmFyXCIsIGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkJBUlwiKSxAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWV9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpKSIsIGN1KTsKLQotCQkKLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBjb252ZXJzaW9uVmFsdWVzIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQotCQljb252ZXJ0ZXIubW92ZUNvbnZlcnNpb25WYWx1ZSgyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ29udmVyc2lvblZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQotCQljb252ZXJ0ZXIubW92ZUNvbnZlcnNpb25WYWx1ZSgwLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpfSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaXZhdGVPd25lZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3NTNmZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByaXZhdGVPd25lZFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBQcml2YXRlT3duZWRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpdmF0ZU93bmVkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbiBwcml2YXRlT3duZWQgPSAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCQlhc3NlcnROb3ROdWxsKHByaXZhdGVPd25lZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZE9ubHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkNmJjYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZE9ubHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRPbmx5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gcmVhZE9ubHkgPSAoRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCWFzc2VydE5vdE51bGwocmVhZE9ubHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQzMGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcz1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIobWV0aG9kPVwidHJhbnNmb3JtZXJNZXRob2RcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKQk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcz1CYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQlyZWFkVHJhbnNmb3JtZXIuc2V0VHJhbnNmb3JtZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChyZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidHJhbnNmb3JtZXJDbGFzcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldE1ldGhvZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyKG1ldGhvZD1cImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQlyZWFkVHJhbnNmb3JtZXIuc2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1ldGhvZCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmY0NzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1N0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU3RydWN0Q29udmVydGVyKGNvbnZlcnRlcj1cIkZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlcigiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU3RydWN0Q29udmVydGVyKGNvbnZlcnRlcj1cIkJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlck51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb252ZXJ0ZXIiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTZiNTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRpbWVPZkRheVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUaW1lT2ZEYXlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkoaG91cj01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShtaW51dGU9NSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhTZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkoc2Vjb25kPTUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWlsbGlzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkobWlsbGlzZWNvbmQ9NSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0aW1lT2ZEYXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldEhvdXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEhvdXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhIb3VyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRIb3VyKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5KGhvdXI9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldEhvdXIobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldEhvdXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGhvdXI9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRNaW51dGUoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkobWludXRlPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRNaW51dGUobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobWludXRlPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aFNlY29uZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhTZWNvbmQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkoc2Vjb25kPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoc2Vjb25kPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWlsbGlzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaWxsaXNlY29uZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShtaWxsaXNlY29uZD04MCkiLCBjdSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihtaWxsaXNlY29uZD04MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5IiwgY3UpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA0NDhmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTiwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCXRyYW5zZm9ybWF0aW9uLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbCh0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHJhbnNmb3JtYXRpb24iLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB0cmFuc2Zvcm1hdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCXRyYW5zZm9ybWF0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWEzNGUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IEZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZSA9IEZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gQmFyLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiaW50Iik7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBpbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRhdGFUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBCYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZSA9IGludC5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9iamVjdFR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU2OGVjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3MgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpCTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzID0gQmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRyYW5zZm9ybWVyQ2xhc3MiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuc2V0TWV0aG9kKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1ldGhvZCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE5vdE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5hZGRDb2x1bW4oKTsKLQkJCi0JCWFzc2VydE5vdE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwidHJhbnNmb3JtZXJNZXRob2RcIiwgY29sdW1uID0gQENvbHVtbikiLCBjdSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSkiLCBjdSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnJlbW92ZUNvbHVtbigpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBnZXROb25OdWxsQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhZGM3Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGFhMjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsxXzEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHdpdGggZWNsaXBzZWxpbmsgMS4xIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzFDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgMS4xIGZpbGUKLQkJY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgsIEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rMV8xQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfUEFUSCwgZmlsZVBhdGgpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjEgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaWZmZXJlbnRseU5hbWVkTWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0yLnhtbCBmaWxlIGJhY2sKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTZhNGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsxXzEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5KcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjI1M2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsxXzEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsxXzEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmsxXzFPcm1YbWxSZXNvdXJjZTsKLQkKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5lY2xpcHNlTGluazFfMU9ybVhtbFJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGRvbid0IGNyZWF0ZSBkZWZhdWx0IG9ybS54bWwgLSBpbnN0ZWFkIGJ1aWxkIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QgPSBzdXBlci5idWlsZEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQkJCi0JCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcodGVzdEpwYVByb2plY3QpKTsKLQkJb3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gdGVzdEpwYVByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgdGVzdEpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9WRVJTSU9OKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZWNsaXBzZUxpbmsxXzFPcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmsxXzFPcm1YbWxSZXNvdXJjZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRFbnRpdHlNYXBwaW5ncygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1YzQ0Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQkvLyBjcmVhdGUgYm90aCBvcm0ueG1sIGFuZCBlY2xpcHNlbGluay1vcm0ueG1sCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpZWxkKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZUZpZWxkcygpLm5leHQoKSwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IHRoZSBwcm9wZXJ0eSBqYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIHVzZWQgaW4gb3JtLgotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsvL2RlZmF1bHQgYWNjZXNzIHdpbGwgYmUgZmllbGQKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1peGVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5SW5KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZTcxZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGNyZWF0ZSBib3RoIG9ybS54bWwgYW5kIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0vLwkKLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVBY2Nlc3NUeXBlRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSwgIkFjY2Vzc1R5cGUiLCAiRklFTEQsIFBST1BFUlRZOyIpOwkKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUsICJBY2Nlc3MiLCAiQWNjZXNzVHlwZSB2YWx1ZSgpOyIpOwotLy8JCWNyZWF0ZUFjY2Vzc1R5cGVFbnVtKCk7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKTsKLS8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotLy8JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLS8vCQkJfQotLy8JCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLS8vCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJASWQiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBJZCIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpOwotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0vL1RPRE8gQWNjZXNzIGFubm90YXRpb24gdGVzdAkKLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZFNwZWNpZmllZFByb3BlcnR5QW5ub3RhdGVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0vLwkJCi0vLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLS8vCQkKLS8vCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8JCQotLy8JCWphdmFQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0vLwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0vLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2ExNjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRSQU5TSUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM4ODUxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwkKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8yL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMGNjMjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLkVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlci5JRCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8yL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JmMzA2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8yL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8yLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8yLkVjbGlwc2VMaW5rMV8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBFY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayAxLjIgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMkNvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjIgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfUEFUSCwgSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzJDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZShTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9WRVJTSU9OKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9QQVRILCBmaWxlUGF0aCk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMiBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0KLQkJLy9jcmVhdGUgdGhlIG9ybTIueG1sIGZpbGUKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIG9ybTIueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8yQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNDZlZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8yLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazFfMkNvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOwotCS8vCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsxXzJDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMV8yQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5MGFiNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5JRCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmU0MGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqICBKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYxMDc4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhQ29sbGVjdGlvblRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlMyk7Ci0JCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlMyA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQkvL2FkZCB0aGUgY29sbGVjdGlvbiB0YWJsZSBhbm5vdGF0aW9uLCB2ZXJpZnkgZGVmYXVsdCBjb2xsZWN0aW9uIHRhYmxlIG5hbWUgaXMgdGhlIHNhbWUKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IHRoZSBlbnRpdHkgbmFtZSwgdmVyaWZ5IGRlZmF1bHQgY29sbGVjdGlvbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJY29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigwKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigyKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBkZjA5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiQWRkcmVzcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgRU1CRUREQUJMRV9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdHJpbmc+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8SW50ZWdlciwgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygibmV3VGFyZ2V0Q2xhc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW1iZWRkYWJsZSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzTm9uR2VuZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NHZW5lcmljQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzTm9uR2VuZXJpY01hcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzR2VuZXJpY01hcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFRhcmdldENsYXNzKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFRhcmdldENsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXQgZW1iZWRkYWJsZSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0IGVtYmVkZGFibGUgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW1iZWRkYWJsZSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkpOwotCQkKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpKTsKLQkJCi0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlV2l0aEJhc2ljVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldCBpcyBhIGJhc2ljIHR5cGUsIHNvIHJlc29sdmVkIHRhcmdldCBlbWJlZGRhYmxlIGlzIG51bGwKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3MpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9IG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGVtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInN0YXRlLm5hbWUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIG5lc3RlZEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBzdGF0ZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJQmFzaWNNYXBwaW5nIGFiYnJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3RhdGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWJiciIpLmdldE1hcHBpbmcoKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy5zdGF0ZSkgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gU3RhdGUuYWJicgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJhYmJyIik7Ci0JCWFzc2VydEVxdWFscygiYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2NvbGxlY3Rpb24gdGFibGUgbmFtZQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MTEVDVElPTl9UQUJMRSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9wYXJjZWxzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCi0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCWNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIHByb3BlcnR5SW5mb0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgcGFyY2VsTnVtYmVyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHByb3BlcnR5SW5mb0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VsTnVtYmVyIikuZ2V0TWFwcGluZygpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTzEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYxIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTzEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9wYXJjZWxzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCWFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUucGFyY2VsTnVtYmVyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLm5hbWUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRheCIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygidGF4IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDMsIDIsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaXplIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWZjZDc3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBhYnN0cmFjdEVudGl0eS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0vLwkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0vLwkvL1RPRE8gYWRkIGFsbCBtYXBwaW5nIHR5cGVzIHRvIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyB0byB0ZXN0IHdoaWNoIG9uZXMgYXJlIG92ZXJyaWRhYmxlCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCi0JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKLQkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlQZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwkJCi0JCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCAgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscyhTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUsIHBlcnNpc3RlbmNlVW5pdC5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKS5nZXRQYXJlbnRFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzA5NzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEludGVnZXIsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBbm5vdGF0aW9uVGVzdFR5cGU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcm9wZXJ0eUluZm8iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmNlbE51bWJlcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHNpemU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgdGF4OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb3BlcnR5SW5mby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZzJfMCA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nMl8wID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJBZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludFF1ZXVlIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicXVldWVzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7IC8vdGhlIGpvaW4gdGFibGUgbmFtZQotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9USEVSX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCXF1ZXVlc01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PVwicXVldWVzXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludEpvYiIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50UXVldWU+IHF1ZXVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWVzIik7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzc18iICsgVFlQRV9OQU1FLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZSBvZiBvd25pbmcgbWFueS10by1tYW55Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgb3duaW5nTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KSBvd25pbmdNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5Kb2luVGFibGVTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vam9pbiB0YWJsZSBuYW1lCi0JCQotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkxBSCIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNmMwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQE1hcHNJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbWFueVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkpKSB7Ci0JCQllYWNoLm1ha2VTcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCQotCQkoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEZhbHNlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmI2YjM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ3VzdG9taXplcihGb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ2hhbmdlVHJhY2tpbmciKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQkvL1RPRE8gdGVzdCBpbmhlcml0aW5nIGEgZGVmYXVsdCByZWFkb25seSBmcm9tIHlvdSBzdXBlcmNsYXNzCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQkJCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7Ci0KLQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmFkZEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUodHJ1ZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0LmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlMjAyYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkJCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb01hbnlHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnkuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7IAkvLyAuZ2V0RWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnkuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQlqYXZhT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gamF2YU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBqYXZhT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoImVtcGxveWVlIik7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL293aW5nIGVudGl0eSB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1BSSU1BUllfVEFCTEUiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5Kb2luVGFibGVTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZQotCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1BSSU1BUllfVEFCTEUiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9Qcm9wZXJ0eUluZm8iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9Qcm9wZXJ0eUluZm8iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ZlNmM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShvcnBoYW5SZW1vdmFsPWZhbHNlKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhT25lVG9PbmVNYXBwaW5nMl8wKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApOwkKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUJhc2ljTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gKChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsgCS8vIC5nZXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvT25lTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIHJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7CQotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjYWMwZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkMDVhNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxDb2xsZWN0aW9uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFDb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNBVEFMT0ciLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJb3JtSm9pbkNvbHVtbiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAicHJvamVjdHMiKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJLy9yZW1vdmUgZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0KLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1ha2VTcGVjaWZpZWQoKTsKLQkJCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhNjhlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmsyXzBPcm1YbWxSZXNvdXJjZTsKLQkKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5lY2xpcHNlTGluazJfME9ybVhtbFJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGRvbid0IGNyZWF0ZSBkZWZhdWx0IG9ybS54bWwgLSBpbnN0ZWFkIGJ1aWxkIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QgPSBzdXBlci5idWlsZEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQkJCi0JCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcodGVzdEpwYVByb2plY3QpKTsKLQkJb3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gdGVzdEpwYVByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgdGVzdEpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIEVjbGlwc2VMaW5rMl8wLlNDSEVNQV9WRVJTSU9OKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZWNsaXBzZUxpbmsyXzBPcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmsyXzBPcm1YbWxSZXNvdXJjZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRFbnRpdHlNYXBwaW5ncygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YjRiNTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gImNpdHkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgPSAiRV9DSVRZIjsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcz1TdHJpbmcuY2xhc3MsIGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb24gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RyaW5nPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0VGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygibmV3VGFyZ2V0Q2xhc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5OT19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkJBU0lDX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9NYW55LnNldE1hcEtleShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCW9uZVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0UGtNYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5KCkpOy8vbm8gcHJpbWFyeSBrZXkgb24gYW4gZW1iZWRkYWJsZQotCQlhc3NlcnRUcnVlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIkludGVnZXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsJCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJ1YnRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkuaW50VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxWYWx1ZUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbHVtbiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCk7Ci0JCQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1NUQVRFX0NPTFVNTiIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHNwZWNpZmllZCwgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikubWFrZVNwZWNpZmllZCgpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpLmludFZhbHVlKCkpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NiksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIHNob3VsZCBoYXZlIG5vIGFmZmVjdCBvbiB0aGUgY29sbGVjdGlvbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWM0ZGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpOwotCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIG9ybUVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLS8vVE9ETwotLy8JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQkKLS8vCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDEsIDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtRW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtRW50aXR5IHN1cGVyY2xhc3MgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQotCQlzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikubWFrZVNwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gb3JtRW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDEsIDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0vLwotLy8JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQkKLS8vCQkvL1RPRE8gam9pbkNvbHVtbnMgZm9yIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzCi0vLy8vCUlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwotLy8vLwlJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKElNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCQotLy8vLwlJT25lVG9PbmVNYXBwaW5nIGFkZHJlc3NNYXBwaW5nID0gKElPbmVUb09uZU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLS8vLy8JSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGFkZHJlc3NNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVoiKTsKLS8vLy8JCi0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFaIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCi0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCi0vLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwlqYXZhRW50aXR5LmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCkuc2V0TmFtZSgiYWRkcmVzcyIpOwotLy8vLwlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCi0JCS8vYWRkIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikubWFrZVNwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCWN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikubWFrZVNwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUyXzAgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscyhTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUsIHBlcnNpc3RlbmNlVW5pdDJfMC5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tU3VwZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBzdWJFbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViRW50aXR5KS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBlbnRpdHkpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBzdWJFbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViRW50aXR5KS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBtYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZhNzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJb3JtTWFueVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1ha2VTcGVjaWZpZWQoKTsKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtTWFueVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5Q2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlqb2JzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQlqb2JzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZXMiKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAicXVldWVzIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIHF1ZXVlc01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBqb2JzT3JkZXJDb2x1bW4gPSBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJT3JkZXJhYmxlMl8wIHF1ZXVlc09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBxdWV1ZXNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgcXVldWVzT3JkZXJDb2x1bW4gPSBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQkKLQkJam9ic09yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlqb2JzT3JkZXJDb2x1bW4gPSBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCXF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlqb2JzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlxdWV1ZXNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCQotCQkoKEVudGl0eSkgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9USEVSX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCXF1ZXVlc01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJxdWV1ZXMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCWpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CQkKLQkJam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKTsKLQkJam9ic01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBqb2JzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwkJCi0JCXF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKTsKLQkJcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCXF1ZXVlc09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBxdWV1ZXNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhSm9ic01hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKT0lOX1RBQkxFIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PVwicXVldWVzXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8dGVzdC5QcmludEpvYj4gam9iczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludFF1ZXVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8dGVzdC5QcmludFF1ZXVlPiBxdWV1ZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRKb2IuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpLmludFZhbHVlKCkpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCS8vYmVjb21lcyBhIDEtbSBieSBkZWZhdWx0Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJLy9lbnRpdHkgdGFibGUgY2hhbmdlcyB0aGUgam9pbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgdmlydHVhbAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODY2M2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgY29vcmRpbmF0aW9uIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjb29yZGluYXRpb24gdHlwZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEV4aXN0ZW5jZUNoZWNraW5nKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEV4aXN0ZW5jZUNoZWNraW5nKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUyXzAgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0KLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1N1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1Yk1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3ViTWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViTWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY5ZDgyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2gubWFrZVNwZWNpZmllZCgpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQkKLQkKLQlwcml2YXRlIE9ybU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEgY29tcGxldGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBvcm0gbW9kZWwgaWdub3JlcyB0aGUgamF2YSBhbm5vdGF0aW9ucwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb01hbnkuc2V0TWFwS2V5Q2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJqb2JzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoInF1ZXVlIik7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9IG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImpvYnMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsJCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKTsKLQkJb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShtYXBwZWRCeT1cInF1ZXVlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcmludFF1ZXVlIHF1ZXVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKS5pbnRWYWx1ZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjVmMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkpKSB7Ci0JCQllYWNoLm1ha2VTcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2gubWFrZVNwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJCi0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlyZXNvdXJjZU9uZVRvT25lLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlyZXNvdXJjZU9uZVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJT3JtSm9pbkNvbHVtbiBpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk5BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRURfTkFNRSIpOwotCQlKYXZhSm9pbkNvbHVtbiBpbnZlcnNlSmF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiSU5WRVJTRV9OQU1FIik7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNBVEFMT0ciLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJLy9yZW1vdmUgbS1tIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1Kb2luVGFibGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93Ci0KLQkJamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlvcm1Kb2luVGFibGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlKTsKLQkJamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKLQkJb3JtSm9pblRhYmxlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFX05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIHJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlbGF0aW9uc2hpcFJlZmVyZW5jZS5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsJCi0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVhNzdjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbWFueVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkpKSB7Ci0JCQllYWNoLm1ha2VTcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2gubWFrZVNwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2gubWFrZVNwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7Ci0JCQotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGphdmFNYW55VG9PbmVNYXBwaW5nID0gKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKSk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCU9ybUpvaW5Db2x1bW4gaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9IGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9OQU1FIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOwotCQlqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtSm9pblRhYmxlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQotCQlqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZSk7Ci0JCWphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOwotCQlvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFX05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2Uuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVsYXRpb25zaGlwUmVmZXJlbmNlLnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbGF0aW9uc2hpcFJlZmVyZW5jZS51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWxhdGlvbnNoaXBSZWZlcmVuY2UudXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUocmVsYXRpb25zaGlwUmVmZXJlbmNlLnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0MTA1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDcxNzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIENvbm5lY3Rpb24yXzAgY29ubmVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19OQVRJVkVfU1FMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIgPSAhIE5BVElWRV9TUUxfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRSA9ICJjb25uZWN0aW9uLmRyaXZlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJjb25uZWN0aW9uLmRyaXZlci4yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfRFJJVkVSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9EUklWRVJfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi5kcml2ZXIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVJMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VUkxfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi51cmwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVNFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VTRVJfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi51c2VyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9QQVNTV09SRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9QQVNTV09SRF9URVNUX1ZBTFVFID0gImxlZ2FjeS5jb25uZWN0aW9uLnBhc3N3b3JkIjsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbm5lY3Rpb24gPSAoQ29ubmVjdGlvbjJfMCkgdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gODsgLy8gRWNsaXBzZUxpbmsgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX0RSSVZFUl9LRVksIExFR0FDWV9EUklWRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfVVJMX0tFWSwgTEVHQUNZX1VSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVSTF9LRVksIFVSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9VU0VSX0tFWSwgTEVHQUNZX1VTRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVU0VSX0tFWSwgVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9QQVNTV09SRF9LRVksIExFR0FDWV9QQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBBU1NXT1JEX0tFWSwgUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVcmwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFBhc3N3b3JkKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXJsKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVzZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFBhc3N3b3JkKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0aWVzIE5hbWUgTWlncmF0aW9uIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RHJpdmVyUHJvcGVydHlOYW1lTWlncmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gVmVyaWZ5IGxlZ2FjeSBkcml2ZXIgZXhpc3RzCi0JCWFzc2VydFRydWUoIkxlZ2FjeSBkcml2ZXIgbm90IGV4aXN0cyIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhMRUdBQ1lfRFJJVkVSX0tFWSwgTEVHQUNZX0RSSVZFUl9URVNUX1ZBTFVFKSk7Ci0JCQotCQkvLyBWZXJpZnkgZHJpdmVyIHJlYWQgaW4KLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZHJpdmVyIHJlYWQiLCB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCksIERSSVZFUl9URVNUX1ZBTFVFKTsKLQotCQkvLyBDaGFuZ2UgZHJpdmVyIHZhbHVlCi0JCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JCS8vIFZlcmlmeSBkcml2ZXIgdmFsdWUgY2hhbmdlZAotCQlhc3NlcnRFcXVhbHMoIkRyaXZlciBub3Qgc2V0IiwgdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpLCBEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiUGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IG5vdCBzZXQiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUVfMikpOwotCQkKLQkJLy8gVmVyaWZ5IGxlZ2FjeSBlbnRyeSBoYXMgYmVlbiBkZWxldGVkCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfRFJJVkVSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc05hbWVzTWlncmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGNvbm5lY3Rpb24uaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSBvY2N1cnJlZCBiZWZvcmUgdGVzdC5wdVBvcHVsYXRlKCkgdGhlcmVmb3JlCi0JCS8vIHdlIGNhbm5vdCB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBsZWdhY3kgcHJvcGVydGllcyBvbmx5IGV4aXN0IGluIHRoZSB4bWwKLQkJLy8gVmVyaWZ5IHRoYXQgVXNlciAmIFBhc3N3b3JkIGV4aXN0IGluIGJvdGggZm9ybXMKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KFVTRVJfS0VZLCAgIlByb3BlcnR5IG5vdCBleGlzdHMiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KFBBU1NXT1JEX0tFWSwgICJQcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShMRUdBQ1lfVVNFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IG5vdCBleGlzdHMiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KExFR0FDWV9QQVNTV09SRF9LRVksICAiTGVnYWN5IHByb3BlcnR5IG5vdCBleGlzdHMiKTsKLQkJCi0JCS8vIENoYW5nZSBhIHByb3BlcnR5IHZhbHVlIHRvIHRyaWdnZXIgbWlncmF0aW9uIHJvdXRpbmUKLQkJdGhpcy5jb25uZWN0aW9uLnNldE5hdGl2ZVNxbChOQVRJVkVfU1FMX1RFU1RfVkFMVUUpOwotCQkKLQkJLy8gVmVyaWZ5IHRoYXQgYWxsIGxlZ2FjeSBlbnRyeSBoYXMgYmVlbiBkZWxldGVkCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfRFJJVkVSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9VUkxfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX1VTRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX1BBU1NXT1JEX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQl9Ci0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTYzNDVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBMb2dnaW5nMl8wIGxvZ2dpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNRTF9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNRTF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5zZXZlcmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmNvbmZpZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmFsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5vZmY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuaW5mbzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5jb25maWc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DSU5HX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuYWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE1TX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBETVNfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLm9mZjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBETVNfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmluZm87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBTU9ERUxfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIE1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuY29uZmlnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIE1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVkVSX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuYWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLnNldmVyZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gKExvZ2dpbmcyXzApIHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5RVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5DQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTU7IC8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyAxIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU1FMX0xPR0dJTkdfS0VZLCBTUUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSwgVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFVkVOVF9MT0dHSU5HX0tFWSwgRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDT05ORUNUSU9OX0xPR0dJTkdfS0VZLCBDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUVVFUllfTE9HR0lOR19LRVksIFFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfTE9HR0lOR19LRVksIENBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUFJPUEFHQVRJT05fTE9HR0lOR19LRVksIFBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwgU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVKQl9MT0dHSU5HX0tFWSwgRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRE1TX0xPR0dJTkdfS0VZLCBETVNfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVksIEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KE1FVEFNT0RFTF9MT0dHSU5HX0tFWSwgTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVkVSX0xPR0dJTkdfS0VZLCBXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLCBQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VSVkVSX0xPR0dJTkdfS0VZLCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5sb2dnaW5nOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmxvZ2dpbmcuZ2V0TGV2ZWwocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRoaXMubG9nZ2luZy5zZXRMZXZlbChwcm9wZXJ0eU5hbWUsIChMb2dnaW5nTGV2ZWwpIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTcWwgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU1FMX0xPR0dJTkdfS0VZLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTUUxfTE9HR0lOR19LRVksCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU3FsTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTUUxfTE9HR0lOR19LRVksCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBUcmFuc2FjdGlvbiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zYWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUcmFuc2FjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19LRVksCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRXZlbnQgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFVkVOVF9MT0dHSU5HX0tFWSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFVkVOVF9MT0dHSU5HX0tFWSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXZlbnRMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVWRU5UX0xPR0dJTkdfS0VZLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb24gTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb25uZWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19LRVksCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ29ubmVjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX0tFWSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUXVlcnkgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlRVUVSWV9MT0dHSU5HX0tFWSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlRVUVSWV9MT0dHSU5HX0tFWSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUXVlcnlMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVFVRVJZX0xPR0dJTkdfS0VZLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENhY2hlIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfTE9HR0lOR19LRVksCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfTE9HR0lOR19LRVksCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9MT0dHSU5HX0tFWSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9wYWdhdGlvbiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BhZ2F0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9wYWdhdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19LRVksCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogU2VxdWVuY2luZyBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlcXVlbmNpbmdMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19LRVksCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXF1ZW5jaW5nTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfS0VZLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFSkIgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFSkJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRUpCX0xPR0dJTkdfS0VZLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFSkJfTE9HR0lOR19LRVksCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRUpCTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFSkJfTE9HR0lOR19LRVksCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBETVMgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRETVNMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRE1TX0xPR0dJTkdfS0VZLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlETVNfTE9HR0lOR19LRVksCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRE1TTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlETVNfTE9HR0lOR19LRVksCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFSkIgb3IgTWV0YWRhdGEgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFSkJPck1ldGFkYXRhTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUVKQk9yTWV0YWRhdGFMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIE1ldGFtb2RlbCBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGFtb2RlbExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19LRVksCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX0tFWSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVNZXRhbW9kZWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX0tFWSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFdlYXZlciBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWRVJfTE9HR0lOR19LRVksCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZFUl9MT0dHSU5HX0tFWSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2ZXJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZFUl9MT0dHSU5HX0tFWSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFByb3BlcnRpZXMgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19LRVksCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvcGVydGllc0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUFJPUEVSVElFU19MT0dHSU5HX0tFWSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogU2VydmVyIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VydmVyTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFUlZFUl9MT0dHSU5HX0tFWSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VSVkVSX0xPR0dJTkdfS0VZLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlcnZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0VSVkVSX0xPR0dJTkdfS0VZLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzgzNzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMyXzBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zMl8wIG9wdGlvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtcGVyc2lzdF9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS1wZXJzaXN0X2dyb3VwIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtdXBkYXRlX2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtdXBkYXRlX2dyb3VwIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtcmVtb3ZlX2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtcmVtb3ZlX2dyb3VwIjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcHRpb25zID0gKE9wdGlvbnMyXzApIHRoaXMuc3ViamVjdC5nZXRPcHRpb25zKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA1OyAvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gMSBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExPQ0tfVElNRU9VVF9LRVksIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFFVRVJZX1RJTUVPVVRfS0VZLCBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0KLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldExvY2tUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRMb2NrVGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0UXVlcnlUaW1lb3V0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9ja1RpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxvY2tUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVF1ZXJ5VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0ZGRiMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBvcHVsYXRlUHUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApOwkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdEVjbGlwc2VMaW5rMl8wQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTFjOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMl8wQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIwYzYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzIi8+Ci0gICAgPGVjaG8gbGV2ZWw9ImRlYnVnIiBtZXNzYWdlPSJ0ZXN0Um9vdDogJHt0ZXN0Um9vdH0iIC8+Ci0gICAgPGZhaWwgbWVzc2FnZT0idGVzdFJvb3QgbXVzdCBiZSBzZXQiIHVubGVzcz0idGVzdFJvb3QiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIAk8cHJvcGVydHkgZmlsZT0iJHt0ZXN0Um9vdH0vdGVzdFNlcnZlci5wcm9wZXJ0aWVzIi8+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJqcHQtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pwdF9mb2xkZXIiLz4KLQkgICAgPGRlbGV0ZSBkaXI9IiR7anB0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0JCQotCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anB0LWZvbGRlcn0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj0ke3Rlc3REaXJ9LyR7anB0LXBlcnNpc3RlbmNlLWphcn0gLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPSR7dGVzdERpcn0vJHtqcHQtZWNsaXBzZWxpbmstamFyfSIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYTZkOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9nZW4vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU5ZmViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmRkYTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoxNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWI5MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEp1bCAwNyAyMDoxMzoyNCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJmNjcwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iMS4yLjAiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iMS4xLjEiLAotIG9yZy5lY2xpcHNlLmpwdC5nZW47YnVuZGxlLXZlcnNpb249IjEuMS4wIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4ZDRiZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjlhNWRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotIyAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0jICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9FbnRpdHlHZW5Ub29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9FbnRpdHlHZW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGU5ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5FbnRpdHlHZW5Ub29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbnRpdHlHZW5Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUxKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiNW9vIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lMigpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lMygpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lNCgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb29fYmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0Jhcl8iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWU1KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vQmFyIik7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb29fYmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0Jhcl8iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lMSgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1b28iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lMigpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVPTyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTQoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb29fYmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0Jhcl8iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9mb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWU1KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vQmFyIik7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL3Rlc3RzL2ludGVybmFsL0pwdEdlblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRHZW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc5ZDdkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL3Rlc3RzL2ludGVybmFsL0pwdEdlblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWwuRW50aXR5R2VuVG9vbHNUZXN0czsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpwdEdlblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiSlBUIEVudGl0eSBHZW5lcmF0aW9uIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVudGl0eUdlblRvb2xzVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRHZW5UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy90ZXN0LnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQzMTFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cyIvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPGFudCB0YXJnZXQ9Imdlbi10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbC5KcHRHZW5UZXN0cyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIiLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LCBzdWl0ZSwgY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI2MzllLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQwNzc0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NGEwZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6Mjc6MTYgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwOWMxMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjExOWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSI0LjMuMSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudWksCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOGFiODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSMgIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotIyAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFVJIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBhYmI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm0uSnB0VWlQbGF0Zm9ybVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3QuSnB0VWlTV1RUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbC5KcHRVaVV0aWxUZXN0czsKLQotLyoqCi0gKiBSdW5zIGFsbCBKUFQgVUkgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpU1dUVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlVdGlsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlOGZjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlOwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4gc2VsZWN0ZWRWZWhpY2xlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQkKLQkKLQlwcml2YXRlIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuc2VsZWN0ZWRWZWhpY2xlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KCJNeSBWZWhpY2xlcyIpOwotCQkKLQkJdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyID0gCi0JCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCQluZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwKLQkJCQluZXcgVmVoaWNsZUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQobmV3IFJvb3QoKSk7Ci0JCXRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZWxlY3RlZFZlaGljbGUuc2V0VmFsdWUoKFZlaGljbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFVwcGVyQ29udHJvbFBhbmVsKHBhbmVsKTsKLQkJYnVpbGRMb3dlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFVwcGVyQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlidWlsZFZlaGljbGVDb21ibyhwYW5lbCk7Ci0JCWJ1aWxkQ29sb3JDb21ibyhwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFZlaGljbGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KAotCQkJbmV3IFZlaGljbGVUeXBlW10gewotCQkJCVZlaGljbGVUeXBlLkJJQ1lDTEUsIFZlaGljbGVUeXBlLkNBUiwgCi0JCQkJVmVoaWNsZVR5cGUuVFJVQ0ssIFZlaGljbGVUeXBlLkJPQVQKLQkJCX0pOwotCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRWZWhpY2xlVHlwZSgoVmVoaWNsZVR5cGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUudmVoaWNsZVR5cGUoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb2xvckNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tYm9WaWV3ZXIgY29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNvbWJvLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldExhYmVsUHJvdmlkZXIobmV3IENvbG9yTGFiZWxQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0SW5wdXQobmV3IENvbG9yW10ge0NvbG9yLlJFRCwgQ29sb3IuQkxVRSwgQ29sb3IuWUVMTE9XLCBDb2xvci5HUkVFTn0pOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRDb2xvcigoQ29sb3IpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUuY29sb3IoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRMb3dlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWJ1aWxkRWZmZWN0c0xhYmVsKHBhbmVsKTsKLQkJYnVpbGRHcmV5ZWRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkQWN0aW9uUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRFZmZlY3RzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IgZWZmZWN0czogIik7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDMsIDEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkR3JleWVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJncmV5ZWQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldEdyZXllZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc0dyZXllZCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgidHJhbnNsdWNlbnQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldFRyYW5zbHVjZW50KGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQlidXR0b24uc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKHZlaGljbGUgIT0gbnVsbCAmJiB2ZWhpY2xlLmlzVHJhbnNsdWNlbnQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEFjdGlvblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFJlZnJlc2hUcmVlQUNJKCkuZmlsbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlZnJlc2hUcmVlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVmcmVzaCB0cmVlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVmcmVzaFRyZWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZWZyZXNoIHRoZSB0cmVlJ3MgbGFiZWxzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQkKLQl2b2lkIHJlZnJlc2hUcmVlKCkgewotCQl0cmVlLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHJpdmF0ZSBWZWhpY2xlIHNlbGVjdGVkVmVoaWNsZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkVmVoaWNsZS5nZXRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFZlaGljbGVUeXBlKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbG9yTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sb3IpIGVsZW1lbnQpLmRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb290KSB7Ci0JCQkJcmV0dXJuIG5ldyBSb290Q29udGVudFByb3ZpZGVyKAotCQkJCQkoUm9vdCkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlcigKLQkJCQkoVmVoaWNsZSkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxWZWhpY2xlPgotCXsKLQkJcHVibGljIFJvb3RDb250ZW50UHJvdmlkZXIoUm9vdCBpdGVtLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUm9vdCBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoUm9vdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VmVoaWNsZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxWZWhpY2xlPih0aGlzLmdldE1vZGVsKCkudmVoaWNsZXMoKSk7Ci0JCX0KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlQ29udGVudFByb3ZpZGVyKFZlaGljbGUgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFZlaGljbGUgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFZlaGljbGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBnZXRNb2RlbCgpLnBhcmVudCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcihPYmplY3QgZWxlbWVudCwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiBuZXcgVmVoaWNsZUxhYmVsUHJvdmlkZXIoKFZlaGljbGUpIGVsZW1lbnQsIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIFZlaGljbGVMYWJlbFByb3ZpZGVyKFZlaGljbGUgdmVoaWNsZSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHZlaGljbGUsIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVoaWNsZSwgSW1hZ2U+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBtb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuQ09MT1JfUFJPUEVSVFksIFZlaGljbGUuR1JFWUVEX1BST1BFUlRZLCBWZWhpY2xlLlRSQU5TTFVDRU5UX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5pbWFnZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBTdHJpbmc+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBtb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuVkVISUNMRV9UWVBFX1BST1BFUlRZLCBWZWhpY2xlLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuY29sb3IoKS5kZXNjcmlwdGlvbigpICsgJyAnICsgc3ViamVjdC52ZWhpY2xlVHlwZSgpLmRlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCQlyZXR1cm4gYnVpbGRUZXh0TW9kZWwoKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUcmVlTm9kZSBleHRlbmRzIEFic3RyYWN0TW9kZWwKLQl7Ci0JCXByaXZhdGUgVHJlZU5vZGUgcGFyZW50OwotCQkKLQkJCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFRyZWVOb2RlIHBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgVmVoaWNsZVtdIHZlaGljbGVzOwotCQkKLQkJCi0JCXB1YmxpYyBSb290KCkgewotCQkJc3VwZXIobnVsbCk7Ci0JCQl2ZWhpY2xlcyA9IG5ldyBWZWhpY2xlW10gewotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkJJQ1lDTEUsIENvbG9yLkJMVUUpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkNBUiwgQ29sb3IuWUVMTE9XKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5UUlVDSywgQ29sb3IuUkVEKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5CT0FULCBDb2xvci5HUkVFTil9OwotCQl9Ci0JCQotCQlwdWJsaWMgVmVoaWNsZVtdIHZlaGljbGVzKCkgewotCQkJcmV0dXJuIHZlaGljbGVzOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGUgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHJpdmF0ZSBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkVISUNMRV9UWVBFX1BST1BFUlRZID0gInZlaGljbGVUeXBlIjsKLQkJCi0JCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBncmV5ZWQgPSBmYWxzZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JFWUVEX1BST1BFUlRZID0gImdyZXllZCI7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gdHJhbnNsdWNlbnQgPSBmYWxzZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJBTlNMVUNFTlRfUFJPUEVSVFkgPSAidHJhbnNsdWNlbnQiOwotCQkKLQkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQkJCi0JCQkKLQkJcHVibGljIFZlaGljbGUoVHJlZU5vZGUgcGFyZW50LCBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZSwgQ29sb3IgY29sb3IpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQl0aGlzLnZlaGljbGVUeXBlID0gdmVoaWNsZVR5cGU7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZSgpIHsKLQkJCXJldHVybiB2ZWhpY2xlVHlwZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VmVoaWNsZVR5cGUoVmVoaWNsZVR5cGUgbmV3VmVoaWNsZVR5cGUpIHsKLQkJCVZlaGljbGVUeXBlIG9sZFZlaGljbGVUeXBlID0gdmVoaWNsZVR5cGU7Ci0JCQl2ZWhpY2xlVHlwZSA9IG5ld1ZlaGljbGVUeXBlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWRUhJQ0xFX1RZUEVfUFJPUEVSVFksIG9sZFZlaGljbGVUeXBlLCBuZXdWZWhpY2xlVHlwZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb2xvciBjb2xvcigpIHsKLQkJCXJldHVybiBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgbmV3Q29sb3IpIHsKLQkJCUNvbG9yIG9sZENvbG9yID0gY29sb3I7Ci0JCQljb2xvciA9IG5ld0NvbG9yOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkQ29sb3IsIG5ld0NvbG9yKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNHcmV5ZWQoKSB7Ci0JCQlyZXR1cm4gZ3JleWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRHcmV5ZWQoYm9vbGVhbiBuZXdHcmV5ZWQpIHsKLQkJCWJvb2xlYW4gb2xkR3JleWVkID0gZ3JleWVkOwotCQkJZ3JleWVkID0gbmV3R3JleWVkOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHUkVZRURfUFJPUEVSVFksIG9sZEdyZXllZCwgbmV3R3JleWVkKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCgpIHsKLQkJCXJldHVybiB0cmFuc2x1Y2VudDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VHJhbnNsdWNlbnQoYm9vbGVhbiBuZXdUcmFuc2x1Y2VudCkgewotCQkJYm9vbGVhbiBvbGRUcmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50OwotCQkJdHJhbnNsdWNlbnQgPSBuZXdUcmFuc2x1Y2VudDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFJBTlNMVUNFTlRfUFJPUEVSVFksIG9sZFRyYW5zbHVjZW50LCBuZXdUcmFuc2x1Y2VudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbWFnZSBpbWFnZSgpIHsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gSW1hZ2VGYWN0b3J5LmltYWdlKGNvbG9yKCksIGdyZXllZCwgdHJhbnNsdWNlbnQpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGVudW0gVmVoaWNsZVR5cGUKLQl7Ci0JCUJJQ1lDTEUoImJpY3ljbGUiKSwKLQkJQ0FSKCJjYXIiKSwKLQkJVFJVQ0soInRydWNrIiksCi0JCUJPQVQoImJvYXQiKTsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQkKLQkJcHJpdmF0ZSBWZWhpY2xlVHlwZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBlbnVtIENvbG9yCi0JewotCQlSRUQoInJlZCIsIG5ldyBSR0IoMjU1LCAwLCAwKSksCi0JCUJMVUUoImJsdWUiLCBuZXcgUkdCKDAsIDAsIDI1NSkpLAotCQlZRUxMT1coInllbGxvdyIsIG5ldyBSR0IoMjU1LCAyNTUsIDApKSwKLQkJR1JFRU4oImdyZWVuIiwgbmV3IFJHQigwLCAyNTUsIDApKTsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBSR0IgcmdiOwotCQkKLQkJcHJpdmF0ZSBDb2xvcihTdHJpbmcgZGVzY3JpcHRpb24sIFJHQiByZ2IpIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJCXRoaXMucmdiID0gcmdiOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgUkdCIHJnYigpIHsKLQkJCXJldHVybiByZ2I7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VGYWN0b3J5Ci0JewotCQlwcml2YXRlIHN0YXRpYyBSR0IgcmdiKENvbG9yIGNvbG9yLCBib29sZWFuIGdyZXllZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgewotCQkJUkdCIHJnYiA9IChncmV5ZWQpID8gbmV3IFJHQigxMjcsIDEyNywgMTI3KSA6IGNvbG9yLnJnYigpOwotCQkJaWYgKHRyYW5zbHVjZW50KSB7Ci0JCQkJcmdiID0gbmV3IFJHQih0cmFuc2x1Y2lmeShyZ2IucmVkKSwgdHJhbnNsdWNpZnkocmdiLmdyZWVuKSwgdHJhbnNsdWNpZnkocmdiLmJsdWUpKTsKLQkJCX0KLQkJCXJldHVybiByZ2I7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGludCB0cmFuc2x1Y2lmeShpbnQgY29sb3IpIHsKLQkJCXJldHVybiAyNTUgLSAoaW50KSAoKDI1NSAtIGNvbG9yKSAqIDAuMyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBzdGF0aWMgSW1hZ2UgaW1hZ2UoQ29sb3IgY29sb3IsIGJvb2xlYW4gZ3JleWVkLCBib29sZWFuIHRyYW5zbHVjZW50KSB7Ci0JCQlQYWxldHRlRGF0YSBwZCA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge3JnYihjb2xvciwgZ3JleWVkLCB0cmFuc2x1Y2VudCl9KTsKLQkJCUltYWdlRGF0YSBpZCA9IG5ldyBJbWFnZURhdGEoMjAsIDIwLCAxLCBwZCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IDIwOyB4ICsrKSB7Ci0JCQkJZm9yIChpbnQgeSA9IDA7IHkgPCAyMDsgeSArKykgewotCQkJCQlpZC5zZXRQaXhlbCh4LCB5LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBpZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ2MGY1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFJvb3Qgcm9vdDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+IHNlbGVjdGVkTm9kZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciBjb250cm9sVHJlZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3VHJlZTsKLQotCXByaXZhdGUgVGV4dCBub2RlTmFtZVRleHQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5yb290ID0gbmV3IFJvb3QoKTsKLQkJdGhpcy5yb290LmFkZENoaWxkKCJQYXJlbnRfMSIpOwotCQl0aGlzLnNlbGVjdGVkTm9kZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+KHRoaXMucm9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRDb250cm9sVHJlZVBhbmVsKHBhbmVsKTsKLQkJYnVpbGRWaWV3VHJlZVBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udHJvbFRyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJDb250cm9sIHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCQljb250cm9sVHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljb250cm9sVHJlZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRWaWV3VHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld1RyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJWaWV3IHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZVZpZXdlciBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIHRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRyZWUuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRJbnB1dChyb290KTsKLQotCQlyZXR1cm4gdHJlZTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCVRyZWVOb2RlIHNlbGVjdGlvbiA9IChUcmVlTm9kZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXNlbGVjdGVkTm9kZS5zZXRWYWx1ZSgoc2VsZWN0aW9uID09IG51bGwpID8gcm9vdCA6IHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDYsIGZhbHNlKSk7Ci0JCWJ1aWxkTm9kZU5hbWVUZXh0KHBhbmVsKTsKLQkJYnVpbGRBZGRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkUmVtb3ZlQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vZGVOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5vZGVOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlub2RlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIGNoaWxkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkQ2hpbGQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGQgYSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoVHJlZU5vZGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmNhbkhhdmVDaGlsZHJlbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIG5lc3RlZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZE5lc3RlZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgbmVzdGVkIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZW1vdmUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZW1vdmUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZW1vdmUgdGhlIHNlbGVjdGVkIG5vZGUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChldmVudC5nZXROZXdWYWx1ZSgpICE9IHJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNsZWFyIHRoZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVzdG9yZSB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGRDaGlsZCgpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5vZGVOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCXNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpLmFkZENoaWxkKG5vZGVOYW1lKTsKLQkJfQotCX0KLQotCXZvaWQgYWRkTmVzdGVkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGROZXN0ZWRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZSgpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IHNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpOwotCQlub2RlLnBhcmVudCgpLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQobnVsbCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQljb250cm9sVHJlZS5zZXRJbnB1dChyb290KTsKLQkJdmlld1RyZWUuc2V0SW5wdXQocm9vdCk7Ci0JfQotCi0KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQkoVHJlZU5vZGUpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBWaWV3VHJlZVBhcmVudEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJCQkoUGFyZW50KSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFRyZWVOb2RlPgotCXsKLQkJcHVibGljIEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlUcmVlTm9kZSB0cmVlTm9kZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHRyZWVOb2RlLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFRyZWVOb2RlIHRyZWVOb2RlKCkgewotCQkJcmV0dXJuIChUcmVlTm9kZSkgZ2V0TW9kZWwoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZU5vZGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRyZWVOb2RlKCkucGFyZW50KCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRyZWVOb2RlLCBUcmVlTm9kZT4oVHJlZU5vZGUuQ0hJTERSRU5fTElTVCwgdHJlZU5vZGUoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0cmVlTm9kZSgpLmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVRyZWVOb2RlIHRyZWVOb2RlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCVRyZWVOb2RlIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGUsIFRyZWVOb2RlPihzdXBlci5idWlsZENoaWxkcmVuTW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IHRyYW5zZm9ybShUcmVlTm9kZSB2YWx1ZSkgewotCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQkJCQkJZmluYWwgTmVzdCBuZXN0ID0gKE5lc3QpIHZhbHVlOwotCQkJCQkJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJCQkJCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIG5lc3QpIHsKLQkJCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gbmVzdC5jaGlsZHJlbigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChUcmVlTm9kZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFRyZWVOb2RlIHBhcmVudDsKLQotCQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxUcmVlTm9kZT4gY2hpbGRyZW47Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOX0xJU1QgPSAiY2hpbGRyZW4iOwotCi0JCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZSBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFRyZWVOb2RlPihjaGlsZHJlbik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJYWRkSXRlbVRvTGlzdChjaGlsZCwgY2hpbGRyZW4sIENISUxEUkVOX0xJU1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCXJlbW92ZUl0ZW1Gcm9tTGlzdChjaGlsZCwgY2hpbGRyZW4sIENISUxEUkVOX0xJU1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoaW50IGluZGV4KSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQkJbmFtZSA9IG5ld05hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTmVzdGVkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgUGFyZW50KHRoaXMsIG5hbWUpKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFBhcmVudCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUGFyZW50KFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCWFkZENoaWxkKG5ldyBDaGlsZCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkTmVzdGVkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCVRyZWVOb2RlIG5lc3QgPSBuZXcgTmVzdCh0aGlzKTsKLQkJCWFkZENoaWxkKG5lc3QpOwotCQkJbmVzdC5hZGRDaGlsZChuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxDaGlsZD4gbmVzdGxlc3NDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q2hpbGQ+KAotCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUcmVlTm9kZSwgQ2hpbGQ+KGNoaWxkcmVuKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENoaWxkIHRyYW5zZm9ybShUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCXJldHVybiAoKE5lc3QpIG5leHQpLmNoaWxkKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiAoQ2hpbGQpIG5leHQ7Ci0JCQkJCQl9Ci0JCQkJCX0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ2hpbGQgYykgewotCQkJCQlyZXR1cm4gYyAhPSBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBOZXN0IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXB1YmxpYyBOZXN0KFRyZWVOb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCAibmVzdCIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5zaXplKCkgPT0gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IENoaWxkKHRoaXMsIG5hbWUpKTsKLQkJfQotCi0JCS8qIGNhbiBvbmx5IGhhdmUgb25lIGNoaWxkICovCi0JCXB1YmxpYyBDaGlsZCBjaGlsZCgpIHsKLQkJCXJldHVybiAoY2hpbGRyZW4uaXNFbXB0eSgpKSA/IG51bGwgOiAoQ2hpbGQpIGNoaWxkcmVuLmdldCgwKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIENoaWxkIGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXB1YmxpYyBDaGlsZChUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JlZmUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuRXh0ZW5zaW9uVGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IHRlc3RQcm9qZWN0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkV4dGVuc2lvblRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiZXh0ZW5zaW9uLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fQ0xBU1MgPSBFeHRlbnNpb25UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9JRCA9IEV4dGVuc2lvblRlc3RQbHVnaW4uUExVR0lOX0lEOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9JRCA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fQ0xBU1MgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1VJX1BMQVRGT1JNX0lEID0gVEVTVF9QTEFURk9STV9JRDsKLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMudGVzdFByb2plY3QuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm0odGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiY2M5OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVBsYXRmb3JtVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VWlQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlQbGF0Zm9ybVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDEyZWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVtcHR5TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgU2ltcGxlRGlzcGxheWFibGU+KHN1YmplY3RIb2xkZXIsIE1vZGVsLklURU1fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNpbXBsZURpc3BsYXlhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEl0ZW0oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU2ltcGxlRGlzcGxheWFibGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEl0ZW0odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpdGVtQXQoaW50IGluZGV4KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgaXRlbUNvdW50cygpOwotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFNpbXBsZURpc3BsYXlhYmxlPiBjKSB7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiZm9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJhciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiam9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImphciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXoiKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbCgpIHsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXI7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gbnVsbDsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdEl0ZW1zKCkgewotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgY291bnQgb2YgaXRlbXMgaXMgbm90IGluIHN5bmMgd2l0aCB0aGUgbW9kZWwiLAotCQkJbW9kZWwuaXRlbXNTaXplKCksCi0JCQlpdGVtQ291bnRzKCkKLQkJKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbW9kZWwuaXRlbXNTaXplKCk7IGluZGV4KyspIHsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGl0ZW0gYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSBjb21ibyIsCi0JCQkJbW9kZWwuaXRlbUF0KGluZGV4KS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJaXRlbUF0KGluZGV4KQotCQkJKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRCZWZvcmVfUmVtb3ZlSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJCZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBidWlsZFNlbGVjdGVkSXRlbSgpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMyk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdE51bGxTdWJqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLCBzZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGJ1aWxkU2VsZWN0ZWRJdGVtKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCS8vIE51bGwgYmVjYXVzZSB0aGUgc3ViamVjdCBob2xkZXIgZG9lc24ndCBoYXZlIHRoZSBzdWJqZWN0IHNldAotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCi0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSkgewotCi0JCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCi0JCQlhc3NlcnROdWxsKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byBiZSBudWxsIiwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsCi0JCQkJIiIsCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCQllbHNlIGlmICghZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkpIHsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0uZGlzcGxheVN0cmluZygpLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCi0JCS8vIFRlc3QgMQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMgotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMSk7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDIpOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlwcml2YXRlIGJvb2xlYW4gc2V0SXRlbUNhbGxlZDsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fUFJPUEVSVFkgPSAiaXRlbSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTVNfTElTVCA9ICJpdGVtcyI7Ci0KLQkJdm9pZCBhZGRJdGVtcyhJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCWFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgYWRkSXRlbXMoTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCWFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgY2xlYXJJdGVtQ2FsbGVkRmxhZygpIHsKLQkJCXNldEl0ZW1DYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCi0JCWJvb2xlYW4gaXNTZXRJdGVtQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldEl0ZW1DYWxsZWQ7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVtcy5nZXQoaW5kZXgpOwotCQl9Ci0KLQkJTGlzdEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcygpIHsKLQkJCXJldHVybiBpdGVtcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCi0JCWludCBpdGVtc1NpemUoKSB7Ci0JCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVJdGVtcyhJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCXJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBzZXRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIGl0ZW0pIHsKLQkJCXNldEl0ZW1DYWxsZWQgPSB0cnVlOwotCi0JCQlTaW1wbGVEaXNwbGF5YWJsZSBvbGRJdGVtID0gdGhpcy5pdGVtOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSVRFTV9QUk9QRVJUWSwgb2xkSXRlbSwgaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8U2ltcGxlRGlzcGxheWFibGU+IHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lck5vdGlmaWVkOwotCi0JCXZvaWQgY2xlYXJJbmZvKCkgewotCQkJdGhpcy5saXN0ZW5lck5vdGlmaWVkID0gZmFsc2U7Ci0JCQl0aGlzLml0ZW0gPSBudWxsOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lck5vdGlmaWVkKCkgewotCQkJcmV0dXJuIGxpc3RlbmVyTm90aWZpZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PFNpbXBsZURpc3BsYXlhYmxlPiBlKSB7Ci0JCQlsaXN0ZW5lck5vdGlmaWVkID0gdHJ1ZTsKLQkJCWl0ZW0gPSBlLnNlbGVjdGVkSXRlbSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmMTQzZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ0NvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotCi1wdWJsaWMgY2xhc3MgQ0NvbWJvTW9kZWxBZGFwdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCi0JCXJldHVybiBDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0KLQkJcmV0dXJuIENDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMTUyYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLQotcHVibGljIGNsYXNzIENvbWJvTW9kZWxBZGFwdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgQ29tYm8gY29tYm87Ci0JcHJpdmF0ZSBib29sZWFuIGVkaXRhYmxlOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCWVkaXRhYmxlID0gdHJ1ZTsKLQotCQlyZXR1cm4gQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCgpLCBTV1QuUkVBRF9PTkxZKTsKLQkJZWRpdGFibGUgPSBmYWxzZTsKLQotCQlyZXR1cm4gQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb21ib1NlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGl0ZW1BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBpdGVtQ291bnRzKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JQEFmdGVyCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJY29tYm8gPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9KcHRVaVNXVFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYThjMmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9KcHRVaVNXVFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLUBTdWl0ZUNsYXNzZXMKLSh7Ci0JQ0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5jbGFzcywKLQlDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlTV1RUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpU1dUVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVNXVFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTYyOWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgSW50ZWdlcj4oc3ViamVjdEhvbGRlciwgTW9kZWwuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciA9IG51bGw7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXNwaW5uZXIuZGlzcG9zZSgpOwotCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMSgpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8yKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzMoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSB2YWx1ZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlICIgKyB2YWx1ZSwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUNoYW5nZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIHNwaW5uZXIKLQkJdmFsdWUgPSA2OwotCQlzcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBuZXcgdmFsdWUgc2V0IiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc3VwcG9zZWQgdG8gYmUgdXBkYXRlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIERpc2Nvbm5lY3QgZnJvbSBtb2RlbAotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVDYWxsZWQ7Ci0JCXByaXZhdGUgSW50ZWdlciB2YWx1ZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQotCQl2b2lkIGNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCkgewotCQkJc2V0VmFsdWVDYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCUludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0VmFsdWVDYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0VmFsdWVDYWxsZWQ7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gdHJ1ZTsKLQotCQkJSW50ZWdlciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgdmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4YjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNYW5hZ2VyLCBFbXBsb3llZT4oc3ViamVjdEhvbGRlciwgTWFuYWdlci5FTVBMT1lFRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZW1wbG95ZWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihmaW5hbCBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEVtcGxveWVlPiBlKSB7Ci0JCQkJZW1wbG95ZWVzLmNsZWFyKCk7Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChlbXBsb3llZXMsIGUuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPigpOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzdWJqZWN0SG9sZGVyID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIGxpc3Qgb2YgRW1wbG95ZWVzCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuY2hhbmdlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFRlc3QgcmVtb3ZpbmcgdGhlbSBhbGwKLQkJbWFuYWdlci5yZW1vdmVBbGxFbXBsb3llZXMoKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbGlzdCBob2xkZXIgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgbGlzdEhvbGRlci5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgVGFibGUgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlVXAoZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgxKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIGRvd24gdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVEb3duKGVtcGxveWVlMSk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4MSk7Ci0KLQkJaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTm93IHRlc3QgdGhlIGl0ZW0gYmVpbmcgcmVtb3ZlZAotCQltYW5hZ2VyLnJlbW92ZUVtcGxveWVlKGVtcGxveWVlKTsKLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgd2FzIG5vdCByZW1vdmVkIGZyb20gdGhlIHRhYmxlIG1vZGVsIiwgLTEsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDAiLCAwLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlMSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCi0JCS8vIFJlcGxhY2UgdGhlIEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQltYW5hZ2VyLnJlcGxhY2UoZW1wbG95ZWUxLCBlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydFNhbWUoIlRoZSBFbXBsb3llZSB0aGF0IGdvdCByZXBsYWNlZCBzaG91bGQgYmUgYXQgaW5kZXggIiArIGluZGV4MSwgaW5kZXgxLCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNBZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZUl0ZW0gd2FzIGNvcnJlY3RseSBwb3B1bGF0ZWQKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc01vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTQgICAgPSAiRGFsaV80IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjQgPSAiV1RQXzQiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTQgICA9ICJwbHVnLWluXzQiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU1ICAgID0gIkRhbGlfNSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI1ID0gIldUUF81IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU1ICAgPSAicGx1Zy1pbl81IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNiAgICA9ICJEYWxpXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNiA9ICJXVFBfNiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNiAgID0gInBsdWctaW5fNiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU0ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkVGl0bGU0LCBleHBlY3RlZE1hbmFnZXI0KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU1ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkVGl0bGU1LCBleHBlY3RlZE1hbmFnZXI1KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU2ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkVGl0bGU2LCBleHBlY3RlZE1hbmFnZXI2KTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNCk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTYpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSA2IiwgNiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNCk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgMCk7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW50IGluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbnQgaW5kZXg1ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNSk7Ci0JCWludCBpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgNCk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW5kZXg0ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNCk7Ci0JCWluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDUsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAzLCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBSZW1vdmUgMiBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQkvLyBOYW1lIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCWV4cGVjdGVkTmFtZSA9ICJKcHQiOwotCQllbXBsb3llZS5zZXROYW1lKGV4cGVjdGVkTmFtZSk7Ci0KLQkJYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQkvLyBNYW5hZ2VyIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCWV4cGVjdGVkTWFuYWdlciA9ICJib3NzIjsKLQkJZW1wbG95ZWUuc2V0TWFuYWdlcihleHBlY3RlZE1hbmFnZXIpOwotCi0JCWFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJLy8gVGl0bGUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlleHBlY3RlZFRpdGxlID0gIkVjbGlwc2VMaW5rIjsKLQkJZW1wbG95ZWUuc2V0VGl0bGUoZXhwZWN0ZWRUaXRsZSk7Ci0KLQkJYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNBZGRlZFJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlKGVtcGxveWVlMSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAxIiwgMSwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0NsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmNsZWFyKCk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAiLCAwLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRW1wbG95ZWVIb2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihlbXBsb3llZXMpKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHsgMCwgMiB9KTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBlbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDAiLCAwLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFRhYmxlSXRlbVByb3BlcnRpZXMoVGFibGUgdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTWFuYWdlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGl0bGUpCi0JewotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG1hbmFnZXI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9QUk9QRVJUWSA9ICJtYW5hZ2VyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX1BST1BFUlRZID0gInRpdGxlIjsKLQotCQlFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5uYW1lICAgID0gbmFtZTsKLQkJCXRoaXMudGl0bGUgICA9IHRpdGxlOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldFRpdGxlKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0KLQkJdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlTdHJpbmcgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BTkFHRVJfUFJPUEVSVFksIG9sZE1hbmFnZXIsIG1hbmFnZXIpOwotCQl9Ci0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCQl9Ci0KLQkJdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJCVN0cmluZyBvbGRUaXRsZSA9IHRoaXMudGl0bGU7Ci0JCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRJVExFX1BST1BFUlRZLCBvbGRUaXRsZSwgdGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBMaXN0PEVtcGxveWVlPiBlbXBsb3llZXM7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTVBMT1lFRVNfTElTVCA9ICJlbXBsb3llZXMiOwotCi0JCU1hbmFnZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlhZGRJdGVtVG9MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJCXJldHVybiBlbXBsb3llZTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IG5ldyBFbXBsb3llZShuYW1lLCB0aXRsZSwgbWFuYWdlcik7Ci0JCQlyZXR1cm4gYWRkRW1wbG95ZWUoZW1wbG95ZWUpOwotCQl9Ci0KLQkJdm9pZCBjaGFuZ2VFbXBsb3llZXMoTGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQl0aGlzLmVtcGxveWVlcy5jbGVhcigpOwotCQkJdGhpcy5lbXBsb3llZXMuYWRkQWxsKGVtcGxveWVlcyk7Ci0JCQlmaXJlTGlzdENoYW5nZWQoRU1QTE9ZRUVTX0xJU1QsIGVtcGxveWVlcyk7Ci0JCX0KLQotCQlMaXN0SXRlcmF0b3I8RW1wbG95ZWU+IGVtcGxveWVlcygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW1wbG95ZWU+KGVtcGxveWVlcyk7Ci0JCX0KLQotCQlpbnQgZW1wbG95ZWVzU2l6ZSgpIHsKLQkJCXJldHVybiBlbXBsb3llZXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVEb3duKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCArIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlcyhDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMsIGludCB0YXJnZXRJbmRleCkgewotCi0JCQlpbnQgc291cmNlSW5kZXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCQkJZm9yIChFbXBsb3llZSBlbXBsb3llZSA6IGVtcGxveWVlcykgewotCQkJCXNvdXJjZUluZGV4ID0gTWF0aC5taW4oc291cmNlSW5kZXgsIHRoaXMuZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpKTsKLQkJCX0KLQotCQkJbW92ZUl0ZW1zSW5MaXN0KAotCQkJCXRhcmdldEluZGV4LAotCQkJCXNvdXJjZUluZGV4LAotCQkJCWVtcGxveWVlcy5zaXplKCksCi0JCQkJdGhpcy5lbXBsb3llZXMsCi0JCQkJRU1QTE9ZRUVTX0xJU1QKLQkJCSk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZVVwKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCAtIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQWxsRW1wbG95ZWVzKCkgewotCQkJY2xlYXJMaXN0KGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZShFbXBsb3llZSBlbXBsb3llZSkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQkJcmVtb3ZlSXRlbXNGcm9tTGlzdChlbXBsb3llZXMuaXRlcmF0b3IoKSwgdGhpcy5lbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVwbGFjZShFbXBsb3llZSBvbGRFbXBsb3llZSwgRW1wbG95ZWUgbmV3RW1wbG95ZWUpIHsKLQkJCXJlcGxhY2VJdGVtSW5MaXN0KG9sZEVtcGxveWVlLCBuZXdFbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFUl9DT0xVTU4gPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJc3RhdGljIGZpbmFsIGludCBUSVRMRV9DT0xVTU4gPSAxOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE1hbmFnZXJIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTUFOQUdFUl9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE1hbmFnZXIoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TWFuYWdlcih2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpdGxlSG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLlRJVExFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGl0bGUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VGl0bGUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PlszXTsKLQkJCWhvbGRlcnNbTkFNRV9DT0xVTU5dID0gYnVpbGROYW1lSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tUSVRMRV9DT0xVTU5dID0gYnVpbGRUaXRsZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbTUFOQUdFUl9DT0xVTU5dID0gYnVpbGRNYW5hZ2VySG9sZGVyKHN1YmplY3QpOwotCQkJcmV0dXJuIGhvbGRlcnM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjb2x1bW5JbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUVtcGxveWVlIGVtcGxveWVlID0gKEVtcGxveWVlKSBlbGVtZW50OwotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVtcGxveWVlLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0VGl0bGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGVtcGxveWVlLmdldE1hbmFnZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVNb2RlbCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyPEVtcGxveWVlPiB7Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJICAgICAgc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFbXBsb3llZT4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFbXBsb3llZSBpdGVtKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihpdGVtKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtcygpIHsKLQkJCXJldHVybiBzdXBlci5zZWxlY3RlZEl0ZW1zKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlci50YWJsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5M2FmMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EZWZhdWx0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcxKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDEiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJuZXh0IGZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAidW5hdHRhY2hlZCIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMubmV4dEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLm5leHRGbGFnMSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgQm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoQm9vbGVhbiBmbGFnMSwgQm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCX0KLQkJcHJpdmF0ZSBCb29sZWFuIG5leHQoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBiLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5GQUxTRSA6IG51bGw7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKEJvb2xlYW4gZmxhZzEpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcxKCkgewotCQkJdGhpcy5zZXRGbGFnMSh0aGlzLm5leHQodGhpcy5mbGFnMSkpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihCb29sZWFuIGZsYWcyKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMigpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KHRoaXMuZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoQm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQoZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0Tm90RmxhZzIoKSB7Ci0JCQl0aGlzLnNldE5vdEZsYWcyKHRoaXMubmV4dCh0aGlzLm5vdEZsYWcyKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMxNzgzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEFsaWduZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lclRlc3QgewotCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQotCQljb250cm9sQWxpZ25lciA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCi0JCXNoZWxsICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAoY29udHJvbEFsaWduZXIgIT0gbnVsbCkgewotCQkJY29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQkJY29udHJvbEFsaWduZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBiZSAwLCIsCi0JCQkwLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBsYWJlbC5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyVG9JdHNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyKTsKLQkJZmFpbCgiQSBDb250cm9sQWxpZ25lciBjYW4ndCBiZSBhZGRlZCB0byBpdHNlbGYiKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dfQWRkQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnRbXSBtYXhpbXVtV2lkdGggPSBuZXcgaW50WzFdOwotCQlmaW5hbCBpbnRbXSBzaXplID0gbmV3IGludFsxXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcygpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JCQkJc2l6ZVswXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemVbMF0gKyAiLCIsCi0JCQlzaXplWzBdLAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZXMgPSBuZXcgaW50WzJdOwotCi0JCVRpdGxlQXJlYURpYWxvZyBkaWFsb2cgPSBuZXcgVGl0bGVBcmVhRGlhbG9nKFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCi0JCQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCWxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVzWzBdID0gbGFiZWwuZ2V0U2l6ZSgpLng7Ci0JCQkJc2l6ZXNbMV0gPSBidXR0b24uZ2V0U2l6ZSgpLng7Ci0JCQkJbWF4aW11bVdpZHRoWzBdID0gY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQotCQlpbnQgbGFiZWxTaXplICA9IHNpemVzWzBdOwotCQlpbnQgYnV0dG9uU2l6ZSA9IHNpemVzWzFdOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLCBidXR0b25TaXplKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgdmVyeSBsb25nIHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlQb2ludCBuZXdCdXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnROb3RTYW1lKAotCQkJIlRoZSBvbGQgbWF4IGFuZCBuZXcgbWF4IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiLAotCQkJbWF4LAotCQkJbmV3QnV0dG9uU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbmV3QnV0dG9uU2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlPZkNvbnRyb2xBbGlnbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEFsaWduZXIxCi0JCS8vICBeCi0JCS8vICB8LUFsaWduZXIyCi0JCS8vICAgICBeCi0JCS8vICAgICB8LUFsaWduZXIzCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjMgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChjb250cm9sQWxpZ25lcjMpOwotCi0JCS8vIFRlc3QgMQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgbGFiZWwgd2lkZ2V0Iik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IGxhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQljb250cm9sQWxpZ25lcjMuYWRkKGxhYmVsMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBsYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCi0JCS8vIFRlc3QgMgotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMi5zZXRUZXh0KCJTaG9ydExhYmVsIik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlpbnQgbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCWludCBuZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBUZXN0IDMKLQkJTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDMuc2V0VGV4dCgiQSB2ZXJ5IGxvbmcgbGFiZWwgdGhhdCB0YWtlcyBhIGxvdCBvZiBob3Jpem9udGFsIHNwYWNlIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMyk7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBhbGwgdGhlIGxvY2tlZCBhcmUgcmVtb3ZlZAotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMgotCQlsYWJlbDIuc2V0VGV4dCgibW0iKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHRleHQgb2YgbGFiZWwxCi0JCWxhYmVsMS5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlDb21wb3NpdGUgcGFyZW50MSA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIHRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQxLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50MS5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IHJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmV3TGFiZWxXaWR0aDEgPT0gcmVhbFdpZHRoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiWWVzIGFub3RoZXIgYmlnIGxvbmcgbG9uZyB0ZXh0IHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyBsYWJlbCB0byBtYWtlIHN1cmUgQ29udHJvbEFsaWduZXIgd29ya3MgY29ycmVjdGx5Iik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQkvLyBXZWlyZDogSXQgc2VlbXMgbm8gbm90aWZpY2F0aW9uIGlzIHNlbnQsIGZpcmUgb25lIG1hbnVhbGx5Ci0JCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQlldmVudC53aWRnZXQgPSBsYWJlbDE7Ci0JCWV2ZW50LnR5cGUgICA9IFNXVC5SZXNpemU7Ci0JCWxhYmVsMS5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgZXZlbnQpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQyID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJcGFyZW50Mi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGVtcExhYmVsID0gbmV3IExhYmVsKHBhcmVudDIsIFNXVC5OVUxMKTsKLQkJdGVtcExhYmVsLnNldFRleHQobGFiZWwxLmdldFRleHQoKSk7Ci0JCXBhcmVudDIubGF5b3V0KHRydWUpOwotCi0JCXJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIG5ld0xhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKHJlYWxXaWR0aCwgbmV3TGFiZWxXaWR0aDEpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgc2l6ZS54ICsgIiwiLAotCQkJc2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUoYnV0dG9uKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAwLCAiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gV2lkZ2V0IDEKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkvLyBXaWRnZXQgMgotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShwYW5lLCBTV1QuTlVMTCk7Ci0JCXNwYWNlci5zZXRMYXlvdXQoYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCXVwZGF0ZUdyaWREYXRhKHNwYWNlcik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChzcGFjZXIpOwotCi0JCS8vIFdpZGdldCAzCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgMyB3aWRnZXRzIGhhdmUgdGhlIHNhbWUgd2lkdGgKLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgc3BhY2VyU2l6ZSA9IHNwYWNlci5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0JCW1heCA9IE1hdGgubWF4KG1heCwgc3BhY2VyU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJc3BhY2VyU2l6ZS54Ci0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsYWJlbCAodGhlIHdpZGVzdCB3aWRnZXQpIGFuZCBtYWtlIHN1cmUgdGhlIHdpZHRoIHdhcwotCQkvLyBjb3JyZWN0bHkgY2FsY3VsYXRlZAotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCXNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heDIgPSBNYXRoLm1heChzcGFjZXJTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW1heDIKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQltYXgyLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBoYXZlIGJlZW4gYWRqdXN0ZWQiLAotCQkJbWF4MiwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsMSk7Ci0KLQkJd2lkdGggPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJLy8gVGVzdCAxCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQljb250cm9sQWxpZ25lcjIucmVtb3ZlKGxhYmVsMik7Ci0KLQkJd2lkdGggPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbnRyb2wgY29udHJvbCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Y2I3ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0KLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuSG9sZGVyLCBjb21ibyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCWNvbWJvLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjRmNjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlclRlc3QgewotCi0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMTsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUxKCkgewotCi0JCWlmIChwYW5lMSA9PSBudWxsKSB7Ci0KLQkJCXBhbmUxID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUxLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDI6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUxLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhbmUxLCBTV1QuQk9SREVSKTsKLQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIHBhbmUxOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZTIoKSB7Ci0KLQkJaWYgKHBhbmUyID09IG51bGwpIHsKLQotCQkJcGFuZTIgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTlVMTCk7Ci0JCQlwYW5lMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZTIsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoIiZUZXN0MToiKTsKLQotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFuZTIsIFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMjsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogKHZhbHVlID8gcGFuZTEgOiBwYW5lMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQotCQkJcGFyZW50ICAgPSBudWxsOwotCQkJcGFnZUJvb2sgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzd2l0Y2hIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KCk7Ci0JCVRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IHRyYW5zZm9ybWVyID0gYnVpbGRUcmFuc2Zvcm1lcigpOwotCi0JCXBhbmUxID0gYnVpbGRQYW5lMSgpOwotCQlwYW5lMS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlwYW5lMiA9IGJ1aWxkUGFuZTIoKTsKLQkJcGFuZTIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbmV3IENvbnRyb2xTd2l0Y2hlcigKLQkJCXN3aXRjaEhvbGRlciwKLQkJCXRyYW5zZm9ybWVyLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQkvLyBUZXN0IDEKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUocGFnZUJvb2ssICJjdXJyZW50UGFnZSIpOwotCi0JCWFzc2VydE5vdE51bGwoCi0JCQkiVGhlIHBhZ2UgYm9vaydzIHBhZ2Ugc2hvdWxkbid0IGJlIG51bGwiLAotCQkJY29udHJvbAotCQkpOwotCi0JCWFzc2VydFNhbWUoCi0JCQkiVGhlIGN1cnJlbnQgcGFuZSBzaG91bGQgYmUgcGFuZTEiLAotCQkJcGFuZTEsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJUG9pbnQgcGFuZTFTaXplID0gcGFuZTEuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFnZUJvb2tTaXplID0gcGFnZUJvb2suY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS54LAotCQkJcGFnZUJvb2tTaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGhlaWdodCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWlnaHQgb2YgcGFuZTEiLAotCQkJcGFuZTFTaXplLnksCi0JCQlwYWdlQm9va1NpemUueQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQlzd2l0Y2hIb2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCQljb250cm9sID0gKENvbnRyb2wpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUyIiwKLQkJCXBhbmUyLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUyU2l6ZSA9IHBhbmUyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUyIiwKLQkJCXBhbmUyU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzAyZDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2ZiMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLUBTdWl0ZUNsYXNzZXMKLSh7Ci0JQ29udHJvbEFsaWduZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xTd2l0Y2hlclRlc3QuY2xhc3MsCi0JQ29udHJvbEVuYWJsZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuY2xhc3MsCi0JTGFiZWxlZEJ1dHRvblRlc3QuY2xhc3MsCi0JTGFiZWxlZExhYmVsVGVzdC5jbGFzcywKLQlMYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmNsYXNzLAotCVBhbmVFbmFibGVyVGVzdC5jbGFzcywKLQlQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpVXRpbFRlc3RzIHsKLQotCXByaXZhdGUgSnB0VWlVdGlsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVV0aWxUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTMwMzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRCdXR0b25UZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24xKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZEJ1dHRvbihudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBCdXR0b24gZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlidXR0b24uZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWJ1dHRvbi5kaXNwb3NlKCk7Ci0KLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQkJbGFiZWxlZEJ1dHRvbi5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJYnV0dG9uLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyY2U1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIHRleHRIb2xkZXIpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjIyODQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRMYWJlbFRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjEoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZExhYmVsKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWxhYmVsLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWxhYmVsLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZExhYmVsLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWQwODYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJRGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IERpYWxvZ1BhbmU8Tm9kZT4oCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE5vZGU+KCksCi0JCQlwYXJlbnQpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl9Ci0JCX07Ci0KLQkJbmV3IFBhbmVFbmFibGVyKGJvb2xlYW5Ib2xkZXIsIHBhbmUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCXBhbmUuZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZDJkOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVWaXNpYmlsaXR5RW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFBhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlEaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgRGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQluZXcgUGFuZVZpc2liaWxpdHlFbmFibGVyKGJvb2xlYW5Ib2xkZXIsIHBhbmUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCXBhbmUuZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE5ODEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlcnMgKCdlbmFibGVkJyBhbmQgJ3Zpc2libGUnKS4KLSAqIDxwPgotICogTm90ZSB0aGUgYmVoYXZpb3Igb2YgY29tcG9zaXRlczo8dWw+Ci0gKiA8bGk+V2hlbiBhIGNvbXBvc2l0ZSBpcyBkaXNhYmxlZCwgaXRzIGNoaWxkcmVuIGFyZSBkaXNhYmxlZCBidXQgPGVtPm5vdDwvZW0+Ci0gKiAgICAgZ3JheWVkIG91dC4KLSAqIDxsaT5XaGVuIGEgY29tcG9zaXRlIGlzIG1hZGUgaW52aXNpYmxlLCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gbWFkZQotICogICAgIGludmlzaWJsZS4KLSAqIDwvdWw+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdmlzaWJsZUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdFNlbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy52aXNpYmxlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiByZXN1bHQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ6ZXJvIik7Ci0JCXJlc3VsdC5hZGQoIm9uZSIpOwotCQlyZXN1bHQuYWRkKCJ0d28iKTsKLQkJcmVzdWx0LmFkZCgidGhyZWUiKTsKLQkJcmVzdWx0LmFkZCgiZm91ciIpOwotCQlyZXN1bHQuYWRkKCJmaXZlIik7Ci0JCXJlc3VsdC5hZGQoInNpeCIpOwotCQlyZXN1bHQuYWRkKCJzZXZlbiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg1MDAsIDE1MCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHdpZGdldFBhbmVsID0gdGhpcy5idWlsZFdpZGdldFBhbmVscyhtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgd2lkZ2V0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFdpZGdldFBhbmVscyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCi0JCXRoaXMuYnVpbGRXaWRnZXRQYW5lbDEocGFuZWwpOwotCQl0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwyKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwxKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGVuYWJsZWRDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZEVuYWJsZWRDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmVuYWJsZWRIb2xkZXIsIGVuYWJsZWRDb21ib0JveENoZWNrQm94KTsKLQotCQlCdXR0b24gdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gocGFuZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudmlzaWJsZUhvbGRlciwgdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gpOwotCi0JCUxhYmVsIGNvbWJvQm94TGFiZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hMYWJlbChwYW5lbCk7Ci0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdFNlbGVjdGlvbkhvbGRlciwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuZW5hYmxlZEhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMudmlzaWJsZUhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkRW5hYmxlZENvbWJvQm94Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoZWNrQm94KHBhcmVudCwgImVuYWJsZWQiKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsICJ2aXNpYmxlIik7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRDb21ib0JveExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoImxpc3Q6Iik7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGNoZWNrQm94MSA9IHRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgIm9uZSIpOwotCQl0aGlzLmJ1aWxkQ2hlY2tCb3gocGFuZWwsICJ0d28iKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAidGhyZWUiKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAiZm91ciIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5lbmFibGVkSG9sZGVyLCBwYW5lbCwgY2hlY2tCb3gxKTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB3aWRnZXRQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdpZGdldFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyRW5hYmxlZE1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyVmlzaWJsZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROZXh0QnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGVuYWJsZWQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJFbmFibGVkTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBlbmFibGVkIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJFbmFibGVkTW9kZWwoKSB7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHZpc2libGUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJWaXNpYmxlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB2aXNpYmxlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJWaXNpYmxlTW9kZWwoKSB7Ci0JCXRoaXMudmlzaWJsZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIm51bGwgc2VsZWN0aW9uIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLnNldFNlbGVjdGlvbk1vZGVsTnVsbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIm51bGwgc2VsZWN0aW9uIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uTW9kZWxOdWxsKCkgewotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmV4dEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGROZXh0QUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE5leHRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLm5leHQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0Iik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgbmV4dCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXROZXh0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExpc3RTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWluZGV4Kys7Ci0JCXJldHVybiAoaW5kZXggPT0gdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgPyAwIDogaW5kZXg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmluZGV4T2YodGhpcy5nZXRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjIzMmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY2hlY2sgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwodHJ1ZSwgdHJ1ZSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzFIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcxKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc05vdEZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgY2hlY2tCb3hQYW5lbCA9IHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCBjaGVja0JveFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDaGVja0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3gocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMSIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzFIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoInVuYXR0YWNoZWQiKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgZGVmYXVsdCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNoZWNrQm94UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGlwRmxhZzFCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEZsaXBGbGFnMUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImZsaXAgZmxhZyAxIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5mbGlwRmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJmbGlwIGZsYWcgMSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGZsaXBGbGFnMSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RmxhZzEoICEgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuVE9HR0xFKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjMxYWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmVhZC1vbmx5IGNvbWJvLWJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50YXNrTGlzdCA9IG5ldyBUYXNrTGlzdCgpOwotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4odGhpcy50YXNrTGlzdCk7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygic3dpbSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soImJpa2UiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJydW4iKTsKLQkJVGFzayByZXN0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXN0Iik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicmVwZWF0Iik7Ci0JCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHJlc3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDMwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChwYW5lbCwgZmFsc2UpOyAgLy8gZmFsc2UgPSBuYXRpdmUgKENvbWJvKQotCQl0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChwYW5lbCwgdHJ1ZSk7ICAvLyB0cnVlID0gY3VzdG9tIChDQ29tYm8pCi0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGN1c3RvbSA/IDUwIDogMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoY3VzdG9tID8gMTAwIDogNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwsIGN1c3RvbSk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwsIGN1c3RvbSk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCwgY3VzdG9tKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCwgY3VzdG9tKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCwgY3VzdG9tKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgdW5zb3J0ZWQiOwotCQlpZiAoY3VzdG9tKSBsYWJlbCArPSAiIChjdXN0b20pIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgc29ydGVkIjsKLQkJaWYgKGN1c3RvbSkgbGFiZWwgKz0gIiAoY3VzdG9tKSI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSwgY3VzdG9tKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCI7Ci0JCWlmIChjdXN0b20pIGxhYmVsICs9ICIgKGN1c3RvbSkiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJvYmplY3QgdW5zb3J0ZWQiOwotCQlpZiAoY3VzdG9tKSBsYWJlbCArPSAiIChjdXN0b20pIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCksIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCBzb3J0ZWQiOwotCQlpZiAoY3VzdG9tKSBsYWJlbCArPSAiIChjdXN0b20pIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCksIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3VzdG9tKSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJvYmplY3QgcmV2ZXJzZSBzb3J0ZWQiOwotCQlpZiAoY3VzdG9tKSBsYWJlbCArPSAiIChjdXN0b20pIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrQWRhcHRlcigpLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiB2b2lkIGJ1aWxkQ29tYm9Cb3hQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIExpc3RWYWx1ZU1vZGVsPEU+IG1vZGVsLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCi0JCUxhYmVsIGNvbWJvQm94TGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUIHwgU1dULlZFUlRJQ0FMKTsKLQkJY29tYm9Cb3hMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAyMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJY29tYm9Cb3hMYWJlbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlDb250cm9sIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsLCBjdXN0b20pOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvQm94TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShmZCk7Ci0JCWlmIChjdXN0b20pIHsKLQkJCVNXVFRvb2xzLmJpbmQobW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCAoQ0NvbWJvKSBjb21ib0JveCk7ICAvLyB1c2UgI3RvU3RyaW5nKCkKLQkJfSBlbHNlIHsKLQkJCVNXVFRvb2xzLmJpbmQobW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCAoQ29tYm8pIGNvbWJvQm94KTsgIC8vIHVzZSAjdG9TdHJpbmcoKQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJaW50IHN0eWxlID0gU1dULlJFQURfT05MWTsKLQkJcmV0dXJuIGN1c3RvbSA/IG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSkgOiBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5jb21wYXJlVG8odG8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS19OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS1NfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza0FkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza0FkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcikgewotCQkJc3VwZXIodGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tfUFJPUEVSVFkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGFzayBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhUYXNrIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0UHJpb3JpdHlUYXNrKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza05hbWVBZGFwdGVyKHRoaXMudGFza0xpc3RIb2xkZXIpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcmlvcml0eVRhc2tOYW1lQWRhcHRlcgotCQlleHRlbmRzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPgotCXsKLQkJUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrTmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIHRhc2tMaXN0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXNrTGlzdFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBtaXNjID0gdGhpcy5idWlsZE1pc2NUYXNrUGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKHBhbmVsLCBtaXNjKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRNaXNjVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC00MDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQ2xlYXJMaXN0QUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTGlzdEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGxpc3QiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNoYW5nZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNoYW5nZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNoYW5nZSB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgYWRkQnV0dG9uLCBDb250cm9sIHJlbW92ZUJ1dHRvbikgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24pOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVtb3ZlQnV0dG9uKTsKLQkJdGhpcy50YXNrVGV4dEZpZWxkLnNldExheW91dERhdGEoZmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRhc2tUZXh0RmllbGRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2tUZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QuYWRkVGFzayh0YXNrVGV4dCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJUYXNrcygpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRhc2tMaXN0KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZVByaW9yaXR5VGFzaygpIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKFRhc2sgdGFzayA6IHRoaXMudGFza0xpc3QuZ2V0VGFza3MoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuZ2V0UHJpb3JpdHlUYXNrKCkgPT0gdGFzaykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHRhc2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQlpZiAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayh0YXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFzaygpIHsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSA9IG51bGw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFkgPSAicHJpb3JpdHlUYXNrTmFtZSI7Ci0JCXByaXZhdGUgVGFzayBwcmlvcml0eVRhc2sgPSBudWxsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS19QUk9QRVJUWSA9ICJwcmlvcml0eVRhc2siOwotCQlwdWJsaWMgVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFRhc2s+IGdldFRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3M7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJpb3JpdHlUYXNrTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza05hbWU7Ci0JCX0KLQkJcHVibGljIFRhc2sgZ2V0UHJpb3JpdHlUYXNrKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlUYXNrIHRhc2sgPSB0aGlzLnRhc2tzLmdldChpbmRleCk7Ci0JCQkJaWYgKHRhc2sgPT0gdGhpcy5wcmlvcml0eVRhc2spIHsKLQkJCQkJdGhpcy5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JCQkJfQotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UHJpb3JpdHlUYXNrTmFtZShTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMucHJpb3JpdHlUYXNrTmFtZTsKLQkJCXRoaXMucHJpb3JpdHlUYXNrTmFtZSA9IHByaW9yaXR5VGFza05hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZLCBvbGQsIHByaW9yaXR5VGFza05hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFzayhUYXNrIHByaW9yaXR5VGFzaykgewotCQkJVGFzayBvbGQgPSB0aGlzLnByaW9yaXR5VGFzazsKLQkJCXRoaXMucHJpb3JpdHlUYXNrID0gcHJpb3JpdHlUYXNrOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU9SSVRZX1RBU0tfUFJPUEVSVFksIG9sZCwgcHJpb3JpdHlUYXNrKTsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrTmFtZSgocHJpb3JpdHlUYXNrID09IG51bGwpID8gbnVsbCA6IHByaW9yaXR5VGFzay5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE5YmViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGxpc3QgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVzdCk7Ci0JCVRhc2sgcmVwZWF0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVwZWF0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0YXNrTGlzdFBhbmVsID0gdGhpcy5idWlsZFRhc2tMaXN0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRhc2tMaXN0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3QgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3Qgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGJ1aWxkTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBsaXN0TGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUIHwgU1dULlZFUlRJQ0FMKTsKLQkJbGlzdExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0Qm94ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QocGFuZWwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxpc3RMYWJlbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0Qm94LnNldExheW91dERhdGEoZmQpOwotCQlTV1RUb29scy5iaW5kKG1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JCXJldHVybiBsaXN0Qm94OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tMaXN0QWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4KLQkJaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tMaXN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXIpIHsKLQkJCXN1cGVyKHRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhc2s+IGl0ZXJhdG9yXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJpb3JpdHlUYXNrcygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxUYXNrPiB2YWx1ZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRQcmlvcml0eVRhc2tzKHZhbHVlcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB0YXNrTGlzdFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFza0xpc3RQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgbWlzYyA9IHRoaXMuYnVpbGRNaXNjVGFza1BhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbChwYW5lbCwgbWlzYyk7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkTWlzY1Rhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNDAwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyTGlzdEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckxpc3RBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBsaXN0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBhbGwgdGhlIHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB0byB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSBhIHRhc2sgZnJvbSB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNsZWFyQnV0dG9uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjbGVhckJ1dHRvbik7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBhZGRCdXR0b24gPSB0aGlzLmJ1aWxkQWRkQnV0dG9uKHBhbmVsKTsKLQkJQ29udHJvbCByZW1vdmVCdXR0b24gPSB0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFRhc2tUZXh0RmllbGQocGFuZWwsIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRBZGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1RleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGFkZEJ1dHRvbiwgQ29udHJvbCByZW1vdmVCdXR0b24pIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbik7Ci0JCXRoaXMudGFza1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXNrVGV4dEZpZWxkVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFza1RleHQgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2sodGFza1RleHQpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyVGFza3MoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUodGhpcy50YXNrTGlzdCk7Ci0JfQotCi0Jdm9pZCBhZGRQcmlvcml0eVRhc2soKSB7Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2sodGFza3MubmV4dCgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiBwVGFza3MgPSB0aGlzLnRhc2tMaXN0LnByaW9yaXR5VGFza3MoKTsKLQkJaWYgKHBUYXNrcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlUHJpb3JpdHlUYXNrKHBUYXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRhc2s+IHByaW9yaXR5VGFza3MgPSBuZXcgSGFzaFNldDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiA9ICJwcmlvcml0eVRhc2tzIjsKLQkJcHVibGljIFRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGFzaz4gcHJpb3JpdHlUYXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza3MuaXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgVGFzayBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2tOYW1lLCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCVRhc2sgdGFzayA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrLCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCXJldHVybiB0YXNrOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCVRhc2sgcmVtb3ZlZFRhc2sgPSB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24ocmVtb3ZlZFRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZFByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eVRhc2tzKEl0ZXJhYmxlPFRhc2s+IHRhc2tzKSB7Ci0JCQl0aGlzLnByaW9yaXR5VGFza3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5wcmlvcml0eVRhc2tzLCB0YXNrcyk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OLCB0aGlzLnByaW9yaXR5VGFza3MpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzY2IwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgZW50cnkgZmllbGRzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGFsbENhcHNOYW1lSG9sZGVyOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QoKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0KCkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFsbENhcHNOYW1lSG9sZGVyID0gdGhpcy5idWlsZEFsbENhcHNOYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBbGxDYXBzTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0ZXh0RmllbGRQYW5lbCA9IHRoaXMuYnVpbGRUZXh0RmllbGRQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGV4dEZpZWxkUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRleHRGaWVsZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5uYW1lSG9sZGVyLCB0ZXh0RmllbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc2V0TmFtZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzZXROYW1lQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzZXQgbmFtZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc2V0IG5hbWUiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5uYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19Cg==