ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhYmJlZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ0ODBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjZmMWRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEpEVCBFbmFibGVtZW50Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249VGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgYWxsb3dzIHRoZSBwbHVnaW4gZGV2ZWxvcGVyIHRvIHRoaW5rIG9mIHByb2plY3RzIFxuXAotYXMgY29tcG9zZWQgb2YgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSwgb3RoZXJ3aXNlIGtub3duIGFzIGZhY2V0cywgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgXG5cCi1ieSB0aGUgdXNlci4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZSBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5ZTY4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0IgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjg3NjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlMWRlZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0YzhlZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnNvdXJjZT1vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5zb3VyY2U9b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JhNGZkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBKRFQgRW5hYmxlbWVudCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhbGxvd3MgdGhlIHBsdWdpbiBkZXZlbG9wZXIgdG8gdGhpbmsgb2YgcHJvamVjdHMgXG5cCi1hcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gYXMgZmFjZXRzLCB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBcblwKLWJ5IHRoZSB1c2VyLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmExNWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNGY1Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ0ODBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzliZmE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249VGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgYWxsb3dzIHRoZSBwbHVnaW4gZGV2ZWxvcGVyIHRvIHRoaW5rIG9mIHByb2plY3RzIFxuXAotYXMgY29tcG9zZWQgb2YgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSwgb3RoZXJ3aXNlIGtub3duIGFzIGZhY2V0cywgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgXG5cCi1ieSB0aGUgdXNlci4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZSBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0ZDBjMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjg3NjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1NDA3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxZDcwYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc2MmVmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhbGxvd3MgdGhlIHBsdWdpbiBkZXZlbG9wZXIgdG8gdGhpbmsgb2YgcHJvamVjdHMgXG5cCi1hcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gYXMgZmFjZXRzLCB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBcblwKLWJ5IHRoZSB1c2VyLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGUyN2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvaiIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4MDU4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGs8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMjZkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNXZWQgSmFuIDMxIDE1OjMyOjEyIFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGYyMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkazsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzdiOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWFib3V0VGV4dD0lYmx1cmIKLWZlYXR1cmVJbWFnZT1pbWFnZXMvZWNsaXBzZTMyLnBuZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyYjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmx1cmI9RWNsaXBzZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEpEVCBFbmFibGVtZW50IFNES1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1cblwKLVRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGFsbG93cyB0aGUgcGx1Z2luIGRldmVsb3BlciB0byB0aGluayBvZiBwcm9qZWN0cyBcblwKLWFzIGNvbXBvc2VkIG9mIHVuaXRzIG9mIGZ1bmN0aW9uYWxpdHksIG90aGVyd2lzZSBrbm93biBhcyBmYWNldHMsIHRoYXQgY2FuIGJlIFxuXAotYWRkZWQgYW5kIHJlbW92ZWQgYnkgdGhlIHVzZXIuXG5cCi1cblwKLUNvcHlyaWdodCAoYykgMjAwOCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM3YzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9pbWFnZXMvZWNsaXBzZTMyLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvaW1hZ2VzL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9pbWFnZXMvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQxMWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGsvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBFY2xpcHNlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgSkRUIEVuYWJsZW1lbnQgU0RLCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkay9zcmMvLmRvLW5vdC1kZWxldGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrL3NyYy8uZG8tbm90LWRlbGV0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrL3NyYy8uZG8tbm90LWRlbGV0ZQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMyMmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyNmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBKYW4gMzEgMTU6MzI6MTIgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMGFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMTAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2Fib3V0LmluaSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWM3YjlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hYm91dFRleHQ9JWJsdXJiCi1mZWF0dXJlSW1hZ2U9aW1hZ2VzL2VjbGlwc2UzMi5wbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYWJvdXQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNDI5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJsdXJiPUVjbGlwc2UgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBTREtcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotXG5cCi1UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhbGxvd3MgdGhlIHBsdWdpbiBkZXZlbG9wZXIgdG8gdGhpbmsgb2YgcHJvamVjdHMgXG5cCi1hcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gYXMgZmFjZXRzLCB0aGF0IGNhbiBiZSBcblwKLWFkZGVkIGFuZCByZW1vdmVkIGJ5IHRoZSB1c2VyLlxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzN2M5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvaW1hZ2VzL2VjbGlwc2UzMi5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL2ltYWdlcy9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvaW1hZ2VzL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMDlmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lID0gRWNsaXBzZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIFNESwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGsvc3JjLy5kby1ub3QtZGVsZXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay9zcmMvLmRvLW5vdC1kZWxldGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkay9zcmMvLmRvLW5vdC1kZWxldGUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmVlMjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0iLmRvLW5vdC1kZWxldGUiIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxOGQ0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGJlMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZmE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1jdXN0b21CdWlsZENhbGxiYWNrcyA9IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotY3VzdG9tQnVpbGRDYWxsYmFja3MuZmFpbG9uZXJyb3IgPSB0cnVlCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGd1aWRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjFmMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LCBlZyBAZG90ICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBzb3VyY2UuZm9sZGVybiA6IG4gPSAxIC4uLiBOLCB0aGUgc291cmNlIGZvbGRlcnMgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyICA6IHdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiBnbyAgICAgICAgICAgIC0tPgotCTwhLS0gICA8bmFtZT4uY2xhc3NwYXRoIDogbmFtZSA9IG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldC4gQSAgICAgICAgIC0tPgotCTwhLS0gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggc3RydWN0dXJlLiAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLkBkb3QiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCA8bmFtZT4sIGFmdGVyIHRoZSBjb21waWxlICAgLS0+Ci0JPCEtLSBidXQgYmVmb3JlIGphcmluZy4gIFN1YnN0aXR1dGUgIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uLS0+Ci0JPCEtLSB0YXJnZXQsIGVnIEBkb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHNvdXJjZS5mb2xkZXJuIDogbiA9IDEgLi4uIE4sIHRoZSBzb3VyY2UgZm9sZGVycyAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgIDogd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uIGdvICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIDxuYW1lPi5jbGFzc3BhdGggOiBuYW1lID0gbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LiBBICAgICAgICAgLS0+Ci0JPCEtLSAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhlIGNsYXNzcGF0aCBzdHJ1Y3R1cmUuICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNvbXBpbGUuQGRvdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+ICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIFN1YnN0aXR1dGUgIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCwgZWcgQGRvdCAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgamFyLmxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21waWxhdGlvbiByZXN1bHRzICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgPG5hbWU+LmNsYXNzcGF0aCA6IG5hbWUgPSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQuIEEgICAgICAgICAtLT4KLQk8IS0tICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoIHN0cnVjdHVyZS4gICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTx0YXJnZXQgbmFtZT0icG9zdC5AZG90Ij4KLQkJPGFudAotCQkgIGFudGZpbGU9ImphdmFkb2MueG1sIgotCQkgIHRhcmdldD0iZXhwb3J0LWphdmFkb2MiCi0JCSAgaW5oZXJpdEFsbD0idHJ1ZSIKLQkJICBpbmhlcml0UmVmcz0idHJ1ZSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4KLQk8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvYW5zd2Vycy9wcm9qZWN0RmFjZXRQcmVmZXJlbmNlcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9hbnN3ZXJzL3Byb2plY3RGYWNldFByZWZlcmVuY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWQxM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9hbnN3ZXJzL3Byb2plY3RGYWNldFByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+TWFuYWdpbmcgUHJvamVjdCBGYWNldCBQcmVmZXJlbmNlczwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSIuLi9mb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5NYW5hZ2luZyBQcm9qZWN0IEZhY2V0IFByZWZlcmVuY2VzPC9wPgotCi08cD48Yj5RdWVzdGlvbjogV2hhdCBpcyB0aGUgYmVzdCB3YXkgZm9yIG1hbmFnaW5nIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkCi13aXRoIGEgcHJvamVjdCBmYWNldD88L2I+PC9wPgotCi08cD5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGNhbiBoZWxwIHlvdSBtYW5hZ2UgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgZmFjZXQuIFR3byBzY29wZXMKLWFyZSBzdXBwb3J0ZWQuIFlvdSBjYW4gc3RvcmUgImdsb2JhbCIgcHJlZmVyZW5jZXMgaW4gd29ya3NwYWNlIG1ldGFkYXRhIGFuZAotcHJvamVjdC1zcGVjaWZpYyBwcmVmZXJlbmNlcyBpbiBwcm9qZWN0IG1ldGFkYXRhLiBQcmVmZXJlbmNlcyBzdG9yZWQgYXQgd29ya3NwYWNlIGxldmVsIHdpbGwgbmV2ZXIKLWJlIGRlbGV0ZWQsIHdoaWxlIHByb2plY3QtbGV2ZWwgcHJlZmVyZW5jZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBmYWNldCBpcyB1bmluc3RhbGxlZC48L3A+Ci0KLTxwPlRvIGFjY2VzcyB3b3Jrc3BhY2UtbGV2ZWwgcHJlZmVyZW5jZXMsIHVzZSB0aGUgZm9sbG93aW5nIEFQSTo8L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci1GYWNldGVkUHJvamVjdEZyYW1ld29yay5nZXRQcmVmZXJlbmNlcyggSVByb2plY3RGYWNldCBmYWNldCApOwotPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRvIGFjY2VzcyBwcm9qZWN0LWxldmVsIHByZWZlcmVuY2VzLCB1c2UgdGhlIGZvbGxvd2luZyBBUEk6PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotSUZhY2V0ZWRQcm9qZWN0LmdldFByZWZlcmVuY2VzKCBJUHJvamVjdEZhY2V0IGZhY2V0ICk7Ci08L3ByZT48L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+UmVnYXJkbGVzcyBvZiB0aGUgc2NvcGUsIG1ha2Ugc3VyZSB0byBjYWxsIGZsdXNoKCkgYWZ0ZXIgbWFraW5nIHRoZSBjaGFuZ2VzIHRvIG1ha2Ugc3VyZSB0aGF0Ci1jaGFuZ2VzIGFyZSBwZXJzaXN0ZWQgdG8gZGlzay48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZGVzY3JpcHRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZGVzY3JpcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjOGE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Rlc2NyaXB0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+Q2hlY2tpbmcgV1RQIG91dDwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSJmb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrPC9wPgotCi08cD5UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhbGxvd3MgdGhlIHBsdWdpbiBkZXZlbG9wZXIgdG8gdGhpbmsgb2YgCi1wcm9qZWN0cyBhcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gYXMgZmFjZXRzLCB0aGF0IAotY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGJ5IHRoZSB1c2VyLjwvcD4KLQotPHA+UHJvamVjdCBmYWNldHMgYXJlIG1vc3QgZnJlcXVlbnRseSB1c2VkIGZvciBhZGRpbmcgbmF0dXJlcywgYnVpbGRlcnMsIAotY2xhc3NwYXRoIGVudHJpZXMsIGFuZCByZXNvdXJjZXMgdG8gYSBwcm9qZWN0LjwvcD4KLQotPHA+UHJpbWFyeSBCZW5lZml0czwvcD4KLQotPHVsPgotICA8bGk+Q29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UuPC9saT4KLSAgPGxpPkFiaWxpdHkgdG8gYWNjdXJhdGVseSBkZXNjcmliZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHJ1bnRpbWUgcGxhdGZvcm0uPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Rvd25sb2Fkcy9lbmFibGVtZW50LWV4YW1wbGUuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U3Yzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9lbmFibGluZy1iYXNlZC1vbi1mYWNldHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjZTM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotICAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkVuYWJsaW5nIFVJIEVsZW1lbnRzIEJhc2VkIG9uIFByb2plY3QgRmFjZXRzPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idHV0b3JpYWwvdHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDEgYWxpZ249ImNlbnRlciI+RW5hYmxpbmcgVUkgRWxlbWVudHMgQmFzZWQgb24gUHJvamVjdCBGYWNldHM8L2gxPgotCi08cD5Vc2VyIGludGVyZmFjZSBlbGVtZW50cyBvZnRlbiBuZWVkIHRvIGJlIHNlbGVjdGl2ZWx5IGVuYWJsZWQgYmFzZWQgb24gdGhlCi1wcmVzZW5jZSBvZiBhIGZhY2V0IGluIGEgcHJvamVjdC4gVGhlIHR3byBtb3N0IGNvbW1vbiBleGFtcGxlcyBhcmUgcHJvamVjdCAKLXByb3BlcnRpZXMgcGFnZXMgYW5kIG1lbnUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBmYWNldC4gVGhlIEZhY2V0ZWQgUHJvamVjdAotRnJhbWV3b3JrIHByb3ZpZGVzIGEgd2F5IHRvIGRvIHRoYXQgdmlhIGEgcHJvcGVydHkgdGVzdGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4KLWFueSBleHRlbnNpb24gcG9pbnQgdGhhdCBzdXBwb3J0cyB0aGUgRWNsaXBzZSBQbGF0Zm9ybSdzIGNvbW1vbiBleHByZXNzaW9uCi1sYW5ndWFnZS48L3A+Ci0KLTxwPgotICA8Yj5Qcm9wZXJ0eSBOYW1lOjwvYj4gPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9jb2RlPjxici8+Ci0gIDxiPlByb3BlcnR5IFZhbHVlOjwvYj4gPGNvZGU+W2ZhY2V0LmlkXSg6W3ZlcnNpb24uZXhwcl0pPzwvY29kZT4KLTwvcD4KLQotPHA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgZm9ybWF0IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgeW91IGNhbiBlaXRoZXIgdGVzdAotdXNpbmcganVzdCB0aGUgcHJvamVjdCBmYWNldCBpZCBvciB5b3UgY2FuIGFsc28gaW5jbHVkZSBhIHZlcnNpb24gZXhwcmVzc2lvbiBpZgotb25seSBjZXJ0YWluIHZlcnNpb25zIHNob3VsZCBiZSBtYXRjaGVkLjwvcD4KLQotPHA+VGhlIGZvbGxvd2luZyB0d28gZXhhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRoZSBmYWNldHMgcHJvcGVydHkgdGVzdGVyIGNhbiBiZQotdXNlZC4gVG8gZXhwbG9yZSBmdXJ0aGVyLCB5b3UgY2FuIGFsc28gZG93bmxvYWQgdGhlIAotPGEgaHJlZj0iZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAiPmNvbXBsZXRlIHJ1bm5hYmxlIHNvdXJjZTwvYT4gb2YgdGhlc2UKLWV4YW1wbGVzLjwvcD4KLQotPHA+PGI+RXhhbXBsZSAxPC9iPjwvcD4KLQotPHA+RW5hYmxlcyBhIHByb2plY3QgcHJvcGVydGllcyBwYWdlIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGZhY2V0LiBOb3RlIHRoZQotdXNlIG9mIHRoZSA8Y29kZT5mb3JjZVBsdWdpbkFjdGl2YXRpb248L2NvZGU+IGF0dHJpYnV0ZS4gVGhpcyBhdHRyaWJ1dGUgbWFrZXMKLXN1cmUgdGhhdCB0aGUgcHJvcGVydHkgdGVzdGVyIHdpbGwgYmUgaW52b2tlZCBldmVuIGlmIHRoZSBGYWNldGVkIFByb2plY3QKLUZyYW1ld29yayBwbHVnaW5zIGhhdmUgbm90IGJlZW4gYWN0aXZhdGVkIHlldC4gT21pdHRpbmcgdGhpcyBhdHRyaWJ1dGUgd2lsbCBjYXVzZQotdGhlIHRlc3QgZXhwcmVzc2lvbiB0byByZXR1cm4gZmFsc2UgaW4gdGhhdCBzaXR1YXRpb24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIHRoZQotPGNvZGU+YWRhcHQ8L2NvZGU+IG9wZXJhdG9yIHRvIGFkYXB0IHRoZSBvYmplY3QgdG8gPGNvZGU+SVByb2plY3Q8L2NvZGU+LiBUaGlzCi1pcyBuZWNlc3NhcnkgYXMgc29tZSB2aWV3cyBtYXkgcmVwcmVzZW50IHByb2plY3QgZW50aXRpZXMgdXNpbmcgb3RoZXIgdHlwZXMuIEZvcgotaW5zdGFuY2UsIGluIHRoZSBKRFQncyBQYWNrYWdlIEV4cGxvcmVyIHRoZSBwcm9qZWN0cyBhcmUgaW5zdGFuY2VzIG9mCi08Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q8L2NvZGU+LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlczwvc3Bhbj4iJmd0OwotICAmbHQ7cGFnZQotICAgIGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FeGFtcGxlRmFjZXRQcm9wZXJ0aWVzUGFnZTwvc3Bhbj4iCi0gICAgb2JqZWN0Q2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiIKLSAgICBhZGFwdGFibGU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPnRydWU8L3NwYW4+IgotICAgIG5hbWU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkV4YW1wbGUgRmFjZXQgUHJvcGVydGllczwvc3Bhbj4iCi0gICAgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LmV4YW1wbGVzLmVuYWJsZW1lbnQuRXhhbXBsZUZhY2V0UHJvcGVydGllc1BhZ2U8L3NwYW4+IiZndDsKLSAgICAmbHQ7ZW5hYmxlZFdoZW4mZ3Q7Ci0gICAgICAmbHQ7YWRhcHQgdHlwZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q8L3NwYW4+IiZndDsKLSAgICAgICAgJmx0O3Rlc3QgCi0gICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICAgICAgICBwcm9wZXJ0eT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9zcGFuPiIKLSAgICAgICAgICB2YWx1ZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZS5mYWNldDE8L3NwYW4+Ii8mZ3Q7Ci0gICAgICAmbHQ7L2FkYXB0Jmd0OwotICAgICZsdDsvZW5hYmxlZFdoZW4mZ3Q7ICAgICAgICAgIAotICAmbHQ7L3BhZ2UmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT4KLTwvZGl2PgotCi08cD48Yj5FeGFtcGxlIDI8L2I+PC9wPgotCi08cD5FbmFibGVzIGEgbWVudSBhY3Rpb24gaWYgZWl0aGVyIG9uZSBvZiB0aGUgdHdvIGZhY2V0cyBzcGVjaWZpZWQgaXMgaW5zdGFsbGVkCi1pbiBhIHByb2plY3QuIE5vdGUgdGhlIHVzZSBvZiBhIHZlcnNpb24gZXhwcmVzc2lvbiB0byBtYXRjaCBvbmx5IGNlcnRhaW4gdmVyc2lvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzPC9zcGFuPiImZ3Q7Ci0gICZsdDtvYmplY3RDb250cmlidXRpb24KLSAgICBpZD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZUZhY2V0UG9wdXA8L3NwYW4+IgotICAgIG9iamVjdENsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iCi0gICAgYWRhcHRhYmxlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2FjdGlvbgotICAgICAgaWQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmV4YW1wbGVGYWNldFBvcHVwQWN0aW9uPC9zcGFuPiIKLSAgICAgIGxhYmVsPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FeGFtcGxlIEZhY2V0IFBvcHVwPC9zcGFuPiIKLSAgICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5leGFtcGxlcy5lbmFibGVtZW50LkV4YW1wbGVGYWNldFBvcHVwQWN0aW9uPC9zcGFuPiIKLSAgICAgIG1lbnViYXJQYXRoPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5hZGRpdGlvbnM8L3NwYW4+IgotICAgICAgZW5hYmxlc0Zvcj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Kzwvc3Bhbj4iJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgJmx0O2FkYXB0IHR5cGU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiImZ3Q7Ci0gICAgICAgICZsdDtvciZndDsKLSAgICAgICAgICAmbHQ7dGVzdCAKLSAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+dHJ1ZTwvc3Bhbj4iCi0gICAgICAgICAgICBwcm9wZXJ0eT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9zcGFuPiIKLSAgICAgICAgICAgIHZhbHVlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5leGFtcGxlLmZhY2V0MToxLjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgICAgICAgJmx0O3Rlc3QgCi0gICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPnRydWU8L3NwYW4+IgotICAgICAgICAgICAgcHJvcGVydHk9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgICAgICB2YWx1ZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZS5mYWNldDI6WzEuMS0yLjJdPC9zcGFuPiIvJmd0OwotICAgICAgICAmbHQ7L29yJmd0OwotICAgICAgJmx0Oy9hZGFwdCZndDsKLSAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICZsdDsvb2JqZWN0Q29udHJpYnV0aW9uJmd0OyAgCi0mbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT4KLTwvZGl2PgotCi08YnIvPjxici8+PGJyLz48YnIvPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZm9ybWF0LmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZm9ybWF0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyNjI1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Zvcm1hdC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDU1MgRG9jdW1lbnQgKi8KLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmCi19Ci0KLS51ZWJlcnNjaHJpZnQgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogeC1sYXJnZTsKLQltYXJnaW4tdG9wOiAyMHB4OwotfQotCi0uY29kZSB7Ci0JZm9udC1mYW1pbHk6IENvdXJpZXIsICJDb3VyaWVyIE5ldyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbGluZS1oZWlnaHQ6IDE2cHg7Ci0JY29sb3I6ICMwNDY3QjQ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQlwYWRkaW5nOiA1cHggN3B4IDVweCAxM3B4OwotCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwotfQotCi0ubm90ZSB7Ci0JZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS5kZXNjcmlwdGlvbiB7Ci0JZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Ci0JZm9udC1zaXplOiB4eC1sYXJnZTsKLX0KLQotLnNjaGVtYSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCWZvbnQtc2l6ZTogbGFyZ2UKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2xpc3RlbmVycy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9saXN0ZW5lcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljNzI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2xpc3RlbmVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotICAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkxpc3RlbmluZyBmb3IgQ2hhbmdlcyB0byBGYWNldGVkIFByb2plY3RzPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idHV0b3JpYWwvdHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAKLSAgLnN1YkhlYWRlcgotICB7Ci0gICAgZm9udC1zaXplOiAxNnB4OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVIZWFkZXJDZWxsCi0gIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDsKLSAgICBwYWRkaW5nOiAycHg7Ci0gIH0KLSAgCi0gIC5ldmVudHNUYWJsZVR5cGVDZWxsCi0gIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHBhZGRpbmctdG9wOiAycHg7Ci0gICAgcGFkZGluZy1ib3R0b206IDJweDsKLSAgICBwYWRkaW5nLWxlZnQ6IDJweDsKLSAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsCi0gIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHBhZGRpbmctdG9wOiAycHg7Ci0gICAgcGFkZGluZy1ib3R0b206IDJweDsKLSAgICBwYWRkaW5nLWxlZnQ6IDJweDsKLSAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwKLSAgewotICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gICAgcGFkZGluZzogMnB4OwotICB9Ci0KLTwvc3R5bGU+Ci0KLTxoMSBhbGlnbj0iY2VudGVyIj5MaXN0ZW5pbmcgZm9yIENoYW5nZXMgdG8gRmFjZXRlZCBQcm9qZWN0czwvaDE+Ci0KLTxwPlRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGEgZmFjaWxpdHkgdGhhdCB3aWxsIG5vdGlmeSBhbnkgaW50ZXJlc3RlZCBwYXJ0aWVzIHdoZW4KLWEgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIG1vZGVsIG9mIGEgZmFjZXRlZCBwcm9qZWN0LiBMaXN0ZW5lcnMgY2FuIGJlIHJlZ2lzdGVyZWQgZWl0aGVyIHZpYSBhIGRpcmVjdAotQVBJIGNhbGwgb3IgdmlhIGFuIGV4dGVuc2lvbiBwb2ludC4gTGlzdGVuZXJzIGNhbiBiZSBnbG9iYWwgb3Igc2NvcGVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC48L3A+Ci0KLTxwIGNsYXNzPSJzdWJIZWFkZXIiPkV2ZW50czwvcD4KLQotPHRhYmxlIHN0eWxlPSJib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiPgotCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSGVhZGVyQ2VsbCI+RXZlbnQgVHlwZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUhlYWRlckNlbGwiPkV2ZW50IE9iamVjdCBJbnRlcmZhY2U8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVIZWFkZXJDZWxsIj5EZXNjcmlwdGlvbjwvdGQ+Ci0gIDwvdHI+Ci0KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UFJPSkVDVF9NT0RJRklFRDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklGYWNldGVkUHJvamVjdEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGlzIG1vZGlmaWVkIGluIGFueSB3YXkuIE5vIGRldGFpbGVkIGluZm9ybWF0aW9uIAotICAgICAgYWJvdXQgdGhlIGNoYW5nZSBpcyBwcm92aWRlZC4gTm90ZSB0aGF0IHdoaWxlIGxpc3RlbmluZyBmb3IgUFJPSkVDVF9NT0RJRklFRCBldmVudHMgaXMgCi0gICAgICBndWFyYW50ZWVkIHRvIGNhdGNoIGFsbCBvdGhlciBldmVudHMsIHRoZSBpbnZlcnNlIGlzIG5vdCB0cnVlLiBMaXN0aW5nIG9uIGFsbCB0aGUgb3RoZXIgCi0gICAgICBldmVudHMgaXMgbm90IGd1YXJhbnRlZWQgdG8gY2F0Y2ggYWxsIFBST0pFQ1RfTU9ESUZJRUQgZXZlbnRzLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgYXJlIAotICAgICAgY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgZGV0YWlscyBhYm91dCB0aGUgdHlwZSBvZiB0aGUgY2hhbmdlIAotICAgICAgKHN1Y2ggYXMgd2hlbiB0aGUgZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGZpbGUgaXMgbW9kaWZpZWQgb24gZGlzaykuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IGlzIGluc3RhbGxlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UE9TVF9JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQ+R2V0cyB0cmlnZ2VyZWQgcmlnaHQgYWZ0ZXIgYSBmYWNldCBpcyBpbnN0YWxsZWQuPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9VTklOU1RBTEw8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBPU1RfVU5JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9WRVJTSU9OX0NIQU5HRTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCByaWdodCBiZWZvcmUgYSBmYWNldCB2ZXJzaW9uIGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBPU1RfVkVSU0lPTl9DSEFOR0U8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgcmlnaHQgYWZ0ZXIgYSBmYWNldCB2ZXJzaW9uIGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPkZJWEVEX0ZBQ0VUU19DSEFOR0VEPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gcHJvamVjdCdzIGZpeGVkIGZhY2V0cyBhcmUgY2hhbmdlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+VEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHNldCBvZiBydW50aW1lcyB0aGF0IHRoZSBwcm9qZWN0IHRhcmdldHMgaXMgY2hhbmdlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UFJJTUFSWV9SVU5USU1FX0NIQU5HRUQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXRlZCBydW50aW1lIG9mIHRoZSBwcm9qZWN0IGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgICAKLTwvdGFibGU+Ci0KLTxwIGNsYXNzPSJzdWJIZWFkZXIiPlJlZ2lzdGVyaW5nIGEgTGlzdGVuZXI8L3A+Ci0KLTxwPkFsbCBsaXN0ZW5lcnMgaGF2ZSB0byBpbXBsZW1lbnQgPGNvZGU+SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI8L2NvZGU+IGludGVyZmFjZSB3aGljaCBsb29rcyBsaWtlCi10aGlzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gaGFuZGxlRXZlbnQoIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICk7Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5EZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUsIGl0IG1heSBiZSBwb3NzaWJsZSB0byBjYXN0IHRoZSBldmVudCBvYmplY3QgdG8gYSBtb3JlIHNwZWNpZmljCi1pbnRlcmZhY2UgaW4gb3JkZXIgdG8gZ2V0IGRldGFpbHMgYWJvdXQgdGhlIGV2ZW50LiBTZWUgdGhlIGV2ZW50IHRhYmxlIGZvciBpbmZvcm1hdGlvbiBhYm91dCB3aGljaAotZXZlbnQgb2JqZWN0IGludGVyZmFjZSBjb3JyZXNwb25kcyB3aXRoIHdoaWNoIGV2ZW50IHR5cGUuPC9wPgotCi08cD5UaGVyZSBhcmUgdGhyZWUgd2F5cyB0byByZWdpc3RlciBhIGxpc3RlbmVyOjwvcD4KLQotPG9sPgotICA8bGk+SUZhY2V0ZWRQcm9qZWN0LmFkZExpc3RlbmVyKCk8L2xpPgotICA8bGk+RmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoKTwvbGk+Ci0gIDxsaT5FeHRlbnNpb24gUG9pbnQ6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvcD4KLTwvb2w+Ci0KLTxwPkFsbCBvZiB0aGVzZSBtZXRob2RzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBldmVudHMgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCBhYm91dC4gCi1Ob3Qgc3BlY2lmeWluZyBldmVudCB0eXBlcyBvbiByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgYWxsIGV2ZW50cy4gCi1UaGlzIGlzIHR5cGljYWxseSBub3QgZGVzaXJlZC4gSWYgYSBsaXN0ZW5lciBuZWVkcyB0byByZWFjdCB0byBhbnkgY2hhbmdlIGluIHRoZSBwcm9qZWN0IGFuZCBoYXMgbm8gCi1uZWVkIHRvIGFuYWx5emUgc3BlY2lmaWMgZXZlbnRzLCBpdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIDxjb2RlPlBST0pFQ1RfTU9ESUZJRUQ8L2NvZGU+IAotZXZlbnQuPC9wPgotCi08cD5UaGUgZmlyc3QgbWV0aG9kIHJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgaXMgc2NvcGVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC4gVGhlIGxhc3QgdHdvCi1yZWdpc3RlciBhIGdsb2JhbCBsaXN0ZW5lciB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgaW4gYWxsIGZhY2V0ZWQgcHJvamVjdHMgdGhhdCBhcmUKLXByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZS4gSW4gbW9zdCBjaXJjdW1zdGFuY2VzLCBpZiBhIGdsb2JhbCBsaXN0ZW5lciBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSAKLXJlZ2lzdGVyZWQgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQgcmF0aGVyIHRoYW4gdXNpbmcgPGNvZGU+RmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoKTwvY29kZT4KLUFQSS4gVXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCBndWFyYW50ZWVzIHRoYXQgdGhlIGxpc3RlbmVyIHdpbGwgbm90IG1pc3MgYW55IGV2ZW50cyBkdWUgdG8gbm90Ci1iZWluZyByZWdpc3RlcmVkIGVhcmx5IGVub3VnaC4gSXQgYWxzbyBkZWxheXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBsdWdpbiBidW5kbGUgY29udGFpbmluZyB0aGUKLWxpc3RlbmVyIHVudGlsIGFuIGV2ZW50IHRoYXQgdGhlIGxpc3RlbmVyIGlzIGludGVyZXN0ZWQgaW4gaXMgZmlyZWQuPC9wPgotCi08cCBjbGFzcz0ic3ViSGVhZGVyIj5FeHRlbnNpb24gUG9pbnQ8L3A+Ci0KLTxwPlRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCdzIHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGxpc3RlbmVycyBpcyBxdWl0ZSBzaW1wbGUuIE9ubHkgdHdvIHBpY2VzIG9mCi1pbmZvcm1hdGlvbiBuZWVkIHRvIGJlIHN1cHBsaWVkOiB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZSBhbmQgYW4gb3B0aW9uYWwgbGlzdCBvZiBldmVudCB0eXBlcy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0ieG1sLWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvc3Bhbj4iJmd0OwotICAmbHQ7bGlzdGVuZXIgCi0gICAgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9PC9zcGFuPiIKLSAgICBldmVudFR5cGVzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij57ZXZlbnQudHlwZXN9PC9zcGFuPiIvPiA8aT4oMSBvciBtb3JlKTwvaT4KLSZsdDtleHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgPGNvZGU+ZXZlbnRUeXBlczwvY29kZT4gYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IHR5cGVzLjwvcD4KLQotPHAgY2xhc3M9InN1YkhlYWRlciI+RXhhbXBsZXM8L3A+Ci0KLTxwPlRoaXMgZXhhbXBsZSByZWdpc3RlcnMgYSB2ZXJ5IHNpbXBsZSBsaXN0ZW5lciB0aGF0IHByaW50cyBvdXQgZXZlbnRzIHJlY2VpdmVkLiBUaGUgbGlzdGVuZXIgaXMKLXJlZ2lzdGVyZWQgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZXhhbXBsZS48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20ubXljb3JwLm15cHJvZHVjdDsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGZpbmFsIGNsYXNzPC9zcGFuPiBMaXN0ZW5lckltcGwgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wbGVtZW50czwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IGhhbmRsZUV2ZW50KCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBldmVudC50b1N0cmluZygpICk7Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgcmVnaXN0ZXJzIHRoZSBhYm92ZSBsaXN0ZW5lciBvbiBhIHNwZWNpZmljIHByb2plY3QgdG8gbGlzdGVuIGZvcgotY2hhbmdlcyBpbiB0aGUgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCB0YXJnZXRzLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLQotLi4uCi0KLUlQcm9qZWN0IHBqOwotCi0uLi4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElGYWNldGVkUHJvamVjdCBmcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHBqICk7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMaXN0ZW5lckltcGwoKTsKLQotZnBqLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCApOwotICAgICAgICAgICAgICAgICAKLS4uLgotCi1mcGoucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCByZWdpc3RlciB0aGUgYWJvdmUgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciB0aGUgUFJFX0lOU1RBTEwgYW5kCi1QUkVfVU5JTlNUQUxMIGV2ZW50cyBpbiBhbGwgZmFjZXRlZCBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci0KLS4uLgotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMaXN0ZW5lckltcGwoKTsKLQotRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9JTlNUQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTCApOwotICAgICAgICAgICAgICAgICAKLS4uLgotCi1GYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGFjY29tcGxpc2hlcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgb25lIGFib3ZlLCBleGNlcHQgaXQgZG9lcyB0aGlzCi12aWEgdGhlIGV4dGVuc2lvbiBwb2ludC48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0ieG1sLWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvc3Bhbj4iJmd0OwotICAmbHQ7bGlzdGVuZXIgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmNvbS5teWNvcnAubXlwcm9kdWN0Lkxpc3RlbmVySW1wbDwvc3Bhbj4iIGV2ZW50VHlwZXM9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPlBSRV9JTlNUQUxMLFBSRV9VTklOU1RBTEw8L3NwYW4+Ii8+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPGJyLz48YnIvPjxici8+PGJyLz4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGJmYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgxYWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZTI5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTRiNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM5MDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3NjkwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzNlMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDguZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA0MGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3NvbHV0aW9uLnppcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3NvbHV0aW9uLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YjdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL21hdGVyaWFscy9zb2x1dGlvbi56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL21hdGVyaWFscy9zdGFydGVyLnppcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3N0YXJ0ZXIuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwY2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3N0YXJ0ZXIuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC90dXRvcmlhbC5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwMzZhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1wLCB0YWJsZSwgdGQsIHRoIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLXByZSB7ICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQotaDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBsaW5lLWhlaWdodDogMTRweDsgbWFyZ2luLXRvcDogMzBweH0KLWNvZGUgeyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0KLXN1cCB7ICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLGdlbmV2YTsgZm9udC1zaXplOiAxMHB4fQotaDMgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZH0KLWxpIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLWgxIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGR9Ci1ib2R5IHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdDsgY2xpcDogICByZWN0KCAgICk7IG1hcmdpbi10b3A6IDVtbTsgbWFyZ2luLWxlZnQ6IDNtbX0KLS5pbmRleHRvcCB7IGZvbnQtc2l6ZTogeC1sYXJnZTs7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZH0KLS5pbmRleHN1YiB7IGZvbnQtc2l6ZTogeHgtc21hbGw7OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6ICM4MDgwRkZ9Ci0KLXByZSB7Ci0gICAgcGFkZGluZzogMHB4OwotICAgIG1hcmdpbi10b3A6IDBweDsKLSAgICBtYXJnaW4tbGVmdDogMHB4OwotICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICBtYXJnaW4tcmlnaHQ6IDBweDsKLSAgICB0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uY29kZSB7Ci0gCWJvcmRlcjogMXB4IGRhc2hlZCAjM2M3OGI1OwotICAgIGZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseTogQ291cmllcjsKLSAgICBtYXJnaW46IDEwcHg7Ci0JbGluZS1oZWlnaHQ6IDEzcHg7Ci0gICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotICAgIHBhZGRpbmc6IDEwcHg7Ci19Ci0KLS5jb2RlLXhtbCB7Ci0gIGNvbG9yOiAjMDAwMDAwOwotfQotCi0uc2NoZW1hLXR5cGUKLXsKLSAgY29sb3I6ICMwMDkxMDA7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0KLS5zY2hlbWEtdHlwZS1saW5rIGE6bGluawotewotICBjb2xvcjogIzAwOTEwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5zY2hlbWEtdHlwZS1saW5rIGE6dmlzaXRlZAotewotICBjb2xvcjogIzAwOTEwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5zY2hlbWEtY29udHJvbCB7Ci0gIGNvbG9yOiAjMDA5MTAwOwotICBmb250LXN0eWxlOiBpdGFsaWM7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0KLS5jb2RlLXRleHQgewotICBjb2xvcjogIzAwOTEwMDsKLSAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKLX0KLQotLmNvbnRleHQtY29kZSB7Ci0gIGNvbG9yOiAjNzY3Njc2OwotICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwotfQotCi0ueG1sLXRleHQKLXsKLSAgY29sb3I6ICMwMDkxMDA7Ci19Ci0KLS5qYXZhLWNvZGUgCi17Ci0gIGNvbG9yOiAjMDAwMDAwOwotfQotCi0uamF2YS1jb21tZW50IAotewotICBjb2xvcjogIzAwOTEwMDsKLX0KLQotLmphdmEtamF2YWRvYy1rZXl3b3JkCi17Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uamF2YS1rZXl3b3JkCi17Ci0gIGNvbG9yOiAjN2YwMDU1OwotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmphdmEtbGl0ZXJhbAotewotICBjb2xvcjogIzAwOTEwMDsKLX0KLQotLmphdmEtY29udGV4dAotewotICBjb2xvcjogIzc2NzY3NjsKLX0JCi0KLS5qYXZhLWNvbnRleHQta2V5d29yZAotewotICBmb250LXdlaWdodDogYm9sZDsKLX0JCi0KLS5zY3JlZW4tc2hvdCAKLXsKLSAgICBtYXJnaW46IDEwcHg7Ci19Ci0KLS5ibG9jay1pbmRlbnQgCi17Ci0gICAgbWFyZ2luOiAxMHB4OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC90dXRvcmlhbC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC90dXRvcmlhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYyNWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvdHV0b3JpYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci0gIAotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICA8dGl0bGU+RXh0ZW5kaW5nIFdUUCBVc2luZyBQcm9qZWN0IEZhY2V0czwvdGl0bGU+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9InR1dG9yaWFsLmNzcyIvPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgxIGFsaWduPSJjZW50ZXIiPkV4dGVuZGluZyBXVFAgVXNpbmcgUHJvamVjdCBGYWNldHM8L2gxPgotCi08YmxvY2txdW90ZT4KLTxiPlN1bW1hcnk8L2I+PGJyLz4KLVRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGFsbG93cyB0aGUgcGx1Z2luIGRldmVsb3BlciB0byB0aGluayBvZiBXZWIgVG9vbHMgCi1QbGF0Zm9ybSAoV1RQKSBwcm9qZWN0cyBhcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gCi1hcyBmYWNldHMsIHRoYXQgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGJ5IHRoZSB1c2VyLiBUaGlzIHR1dG9yaWFsIHdhbGtzIHlvdSAKLXRocm91Z2ggYW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIGNvdXBsZSBvZiBiYXNpYyBmYWNldHMgYW5kIGluIHRoZSBwcm9jZXNzIAotY292ZXJzIHRoZSBtYWpvcml0eSBvZiB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cy4gVGhpcyB0dXRvcmlhbCBoYXMgYmVlbgotd3JpdHRlbiBmb3IgdmVyc2lvbiAxLjUgb2YgdGhlIFdlYiBUb29scyBQbGF0Zm9ybS4KLTxici8+PGJyLz4KLQotPGI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2I+PGJyLz4KLUJFQSBTeXN0ZW1zLCBJbmMuPGJyLz4KLVNlcHRlbWJlciA1LCAyMDA2Ci08L2Jsb2NrcXVvdGU+Ci0KLTxociB3aWR0aD0iMTAwJSI+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGEgcG93ZXJmdWwgbWVjaGFuaXNtIGZvciBleHRlbmRpbmcgdGhlCi1jYXBhYmlsaXRpZXMgb2YgdGhlIFdlYiBUb29scyBQbGF0Zm9ybS4gUHJvamVjdCBmYWNldHMgYXJlIHR5cGljYWxseSB1c2VkIGFzCi1hIHdheSBvZiBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byBhIHByb2plY3QuIFdoZW4gYSBmYWNldCBpcyBhZGRlZCB0byB0aGUKLXByb2plY3QgaXQgY2FuIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBzZXR1cCBhY3Rpb25zIHN1Y2ggYXMgY29weWluZyByZXNvdXJjZXMsIAotaW5zdGFsbGluZyBidWlsZGVycywgYWRkaW5nIG5hdHVyZXMsIGV0Yy4gRmFjZXRzIGNhbiBhbHNvIGJlIHVzZWQgYXMgbWFya2VycyBmb3IKLWVuYWJsaW5nIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzLjwvcD4KLQotPHA+U29tZSBvZiB0aGUgcmVhZGVycyBtYXkgYmUgd29uZGVyaW5nIGhvdwotZmFjZXRzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJvamVjdCBuYXR1cmVzIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIEVjbGlwc2UKLXBsYXRmb3JtLiBOYXR1cmVzIGFyZSBkZXNpZ25lZCB0byBiZSBoaWRkZW4gZnJvbSB1c2VyJ3Mgdmlldy4gVGhleSBhcmUKLWVzc2VudGlhbGx5IG1hcmtlcnMgdGhhdCBhcmUgc2V0IGJlaGluZCB0aGUgc2NlbmVzIGJ5IHRvb2xpbmcuIFByb2plY3QgZmFjZXRzLAotb24gdGhlIG90aGVyIGhhbmQsIGhhdmUgYmVlbiBkZXNpZ25lZCBmcm9tIHRoZSBncm91bmQgdXAgdG8gYmUgbWFuaXB1bGF0ZWQgYnkKLXRoZSBlbmQgdXNlcnMuIFRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHVzZXIgCi1pbnRlcmZhY2UgZWxlbWVudHMgZm9yIG1hbmFnaW5nIHRoZSBmYWNldHMgb24gYSBwcm9qZWN0IGFuZCBzaW5jZSBmYWNldHMKLWFyZSBzZWxmIGRlc2NyaWJpbmcgdGhlIHVzZXIgaXMgcHJldmVudGVkIGZyb20gY3JlYXRpbmcgaW52YWxpZCBjb25maWd1cmF0aW9ucy4KLUJhc2ljYWxseSwgaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB3cml0ZSBjdXN0b20gcHJvamVjdCBjcmVhdGlvbiB3aXphcmRzIG9yCi10aGUgIkVuYWJsZSBGZWF0dXJlIFgiIG1lbnUgYWN0aW9ucy4gQ29tbW9uIHdheSBvZiBtYW5hZ2luZyB3aGljaCBmYWNldHMgYXJlCi1pbnN0YWxsZWQgb24gYSBwcm9qZWN0IG1lYW5zIGxlc3MgYnVyZGVuIG9uIHRoZSBwbHVnaW4gd3JpdGVyIGFuZCBiZXR0ZXIgZW5kIHVzZXIKLWV4cGVyaWVuY2UuPC9wPgotCi08cD5UaGlzIHR1dG9yaWFsIGNvdmVycyB0aGUgZXh0ZW5zaW9uIHBvaW50cyBhbmQgSmF2YSBBUEkgdGhhdCBhcmUgdXNlZCBmb3IgCi1jcmVhdGluZyBwcm9qZWN0IGZhY2V0cy4gVGhlIHJlYWRlciBpcyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgZmFtaWxpYXIgd2l0aCAKLWRldmVsb3BpbmcgcGx1Z2lucyBmb3IgRWNsaXBzZSBhbmQgdG8gaGF2ZSB1c2VyLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgV2ViIFRvb2xzIAotUGxhdGZvcm0uPC9wPgotCi08aDI+VHV0b3JpYWwgU2NlbmFyaW88L2gyPgotCi08cD5Zb3UgYXJlIGEgZGV2ZWxvcGVyIGZvciBhIGNvbXBhbnkgd2hpY2ggZGV2ZWxvcHMgYSBwcm9kdWN0IGNhbGxlZAotRm9ybUdlbi4gRm9ybUdlbiBpcyBiYXNpY2FsbHkgYSBzZXJ2bGV0IHRoYXQgZ2VuZXJhdGVzIEhUTUwgZm9ybXMgYmFzZWQgb24gWE1MCi1kZWZpbml0aW9uIGZpbGVzLiBUaGUgcHJvZHVjdCBpcyBjb21wb3NlZCBvZiBhIGphciBjb250YWluaW5nIHRoZSBzZXJ2bGV0IGFuZAotc29tZSBiYXNpYyB3aWRnZXRzLiBUaGVyZSBpcyBhbHNvIGFuIGFkZC1vbiBqYXIgd2l0aCBzb21lIGV4dHJhIHdpZGdldHMuIFVzZXJzCi1oYXZlIGJlZW4gbWFudWFsbHkgYWRkaW5nIHRoZSBqYXJzIGludG8gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yaWVzIG9mIHRoZWlyCi13ZWIgcHJvamVjdHMgYW5kIHNldHRpbmcgdXAgdGhlIHNlcnZsZXQgZGVmaW5pdGlvbnMgaW4gd2ViLnhtbCBieSBoYW5kLiBZb3VyCi10YXNrIGlzIHRvIG1ha2UgdGhpcyBzZXR1cCBlYXNpZXIgYnkgd3JpdGluZyBhIGNvdXBsZSBvZiBwcm9qZWN0IGZhY2V0cyB0aGF0Ci13aWxsIHBlcmZvcm0gdGhlc2UgYWN0aW9ucyBhdXRvbWF0aWNhbGx5LjwvcD4KLQotPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4KLQotPGRpdiBjbGFzcz0iYmxvY2staW5kZW50Ij4KLTEuIDxhIGhyZWY9IiNnZXR0aW5nLnN0YXJ0ZWQiPkdldHRpbmcgU3RhcnRlZDwvYT48YnIvPgotMi4gPGEgaHJlZj0iI2NyZWF0aW5nLmJhc2ljLmZhY2V0cyI+Q3JlYXRpbmcgQmFzaWMgRmFjZXQgRGVmaW5pdGlvbnM8L2E+PGJyLz4KLTMuIDxhIGhyZWY9IiNzcGVjaWZ5aW5nLmNvbnN0cmFpbnRzIj5TcGVjaWZ5aW5nIENvbnN0cmFpbnRzPC9hPjxici8+Ci00LiA8YSBocmVmPSIjaW1wbGVtZW50aW5nLmFjdGlvbnMiPkltcGxlbWVudGluZyBBY3Rpb25zPC9hPjxici8+Ci01LiA8YSBocmVmPSIjY3JlYXRpbmcuY2F0ZWdvcmllcyI+Q3JlYXRpbmcgQ2F0ZWdvcmllczwvYT48YnIvPgotNi4gPGEgaHJlZj0iI2RlY29yYXRpbmciPkRlY29yYXRpbmc8L2E+PGJyLz4KLTcuIDxhIGhyZWY9IiNhZGRpbmcud2l6YXJkLnBhZ2VzIj5BZGRpbmcgV2l6YXJkIFBhZ2VzPC9hPjxici8+Ci04LiA8YSBocmVmPSIjZGVmaW5pbmcucHJlc2V0cyI+RGVmaW5pbmcgUHJlc2V0czwvYT48YnIvPgotOS4gPGEgaHJlZj0iI3J1bnRpbWUubWFwcGluZ3MiPlNwZWNpZnlpbmcgUnVudGltZSBTdXBwb3J0IE1hcHBpbmdzPC9hPjxici8+Ci0xMC4gPGEgaHJlZj0iI3N1bW1hcnkiPlN1bW1hcnk8L2E+PGJyLz4KLUFwcGVuZGl4IEE6IDxhIGhyZWY9IiNjdXN0b20udmVyc2lvbi5jb21wYXJhdG9ycyI+Q3VzdG9tIFZlcnNpb24gQ29tcGFyYXRvcnM8L2E+PGJyLz4KLUFwcGVuZGl4IEI6IDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj5WZXJzaW9uIEV4cHJlc3Npb25zPC9hPjxici8+Ci1BcHBlbmRpeCBDOiA8YSBocmVmPSIjcHJvcGVydHkudGVzdGVyIj5Qcm9wZXJ0eSBUZXN0ZXI8L2E+PGJyLz4KLUFwcGVuZGl4IEQ6IDxhIGhyZWY9IiN3aXphcmQuY29udGV4dCI+V2l6YXJkIENvbnRleHQ8L2E+PGJyLz4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0iZ2V0dGluZy5zdGFydGVkIj4xLiBHZXR0aW5nIFN0YXJ0ZWQ8L2E+PC9oMj4KLQotPHA+VG8gZm9sbG93IGFsb25nIHdpdGggdGhpcyB0dXRvcmlhbCwgeW91IHdpbGwgbmVlZCB0byBoYXZlIGEgd29ya2luZyBpbnN0YWxsIAotb2YgV2ViIFRvb2xzIFBsYXRmb3JtIHYxLjUuIFRoZSB0dXRvcmlhbCBpcyBub3QgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIDEuMC54Ci12ZXJzaW9uIG9mIFdUUCBhcyB0aGVyZSBhcmUgbnVtZXJvdXMgZXh0ZW5zaW9uIHBvaW50IGFuZCBBUEkgZGlmZmVyZW5jZXMuIFlvdSAKLWNhbiBkb3dubG9hZCB0aGUgaW5zdGFsbCBraXRzIGZvciBXVFAgYW5kIGl0cyBwcmVyZXF1aXNpdGVzLCBpbmNsdWRpbmcgRWNsaXBzZSAKLVBsYXRmb3JtIHYzLjIsIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzLyI+RWNsaXBzZSBQbGF0Zm9ybSBEb3dubG9hZCBTaXRlPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvZG93bmxvYWRzLyI+V2ViIFRvb2xzIFBsYXRmb3JtIERvd25sb2FkIFNpdGU8L2E+PC9saT4KLTwvdWw+Ci0KLTxwPk9uY2UgdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGhhcyBiZWVuIGluc3RhbGxlZCB5b3Ugd2lsbCBuZWVkIHRvCi1jcmVhdGUgYSBuZXcgd29ya3NwYWNlIGFuZCBhZGQgdGhlIDxhIGhyZWY9Im1hdGVyaWFscy9zdGFydGVyLnppcCI+c3RhcnRlciBwcm9qZWN0PC9hPgotdG8gaXQuIFRoZSBzdGFydGVyIHByb2plY3QgaW5jbHVkZXMgdGhlIG1hdGVyaWFscyBhbmQgdXRpbGl0eSBjb2RlIHRoYXQgd2lsbAotYmUgdXNlZCBpbiB0aGlzIHR1dG9yaWFsLiBJZiB5b3UgZ2V0IHN0dWNrIGF0IGFueSBwb2ludCB5b3UgY2FuIHRha2UgYSBwZWVrIGF0Ci10aGUgPGEgaHJlZj0ibWF0ZXJpYWxzL3NvbHV0aW9uLnppcCI+c29sdXRpb24gcHJvamVjdDwvYT4uPC9wPgotCi08aDI+PGEgbmFtZT0iY3JlYXRpbmcuYmFzaWMuZmFjZXRzIj4yLiBDcmVhdGluZyBCYXNpYyBGYWNldCBEZWZpbml0aW9uczwvYT48L2gyPgotCi08cD5Qcm9qZWN0IGZhY2V0cyBhcmUgZGVjbGFyZWQgdmlhIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L2NvZGU+Ci1leHRlbnNpb24gcG9pbnQuIFRoaXMgaXMgYSBwcmV0dHkgbGFyZ2UgZXh0ZW5zaW9uIHBvaW50IHdpdGggbG90cyBvZiBmYWNpbGl0aWVzLAotYnV0IHdlIHdpbGwgc3RhcnQgc21hbGwgYW5kIHByb2dyZXNzIGluY3JlbWVudGFsbHkgd2hpbGUgYnVpbGRpbmcgdGhlIHR1dG9yaWFsCi1mYWNldHMuIEhlcmUgaXMgdGhlIHBhcnQgb2YgdGhlIHNjaGVtYSB0aGF0IHdlIHdpbGwgYmUgd29ya2luZyB3aXRoIGluaXRpYWxseTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgICAmbHQ7bGFiZWwmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KG9wdGlvbmFsKTwvc3Bhbj4KLSAgJmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAKLSZsdDsvZXh0ZW5zaW9uJmd0OzwvcHJlPgotPC9kaXY+Ci0KLTxwPkFzIHlvdSBjYW4gc2VlLCB0aGVyZSBhcmUgdHdvIHRvcC1sZXZlbCBlbGVtZW50cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbgotcG9pbnQgc2NoZW1hLiBUaGUgPGNvZGU+Jmx0O3Byb2plY3QtZmFjZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgdG8gZGVjbGFyZQotdGhlIGZhY2V0IGl0c2VsZi4gVGhlIDxjb2RlPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQKLXRvIGRlY2xhcmUgdmVyc2lvbnMgb2YgdGhlIGZhY2V0LiBFdmVyeSBmYWNldCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBwcm92aWRlCi1hdCBsZWFzdCBvbmUgZmFjZXQgdmVyc2lvbiBkZWNsYXJhdGlvbi4gSW4gZmFjdCwgYXMgeW91IHdpbGwgc2VlIGxhdGVyIGluIHRoaXMKLXR1dG9yaWFsLCB0aGUgYnVsayBvZiB0aGUgd29yayBoYXBwZW5zIGluIHRoZSA8Y29kZT4mbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OzwvY29kZT4KLWRlY2xhcmF0aW9uLiBGb3Igbm93IGFsbCB5b3UgbmVlZCB0byByZW1lbWJlciBpcyB0aGF0IGEgZmFjZXQgY2Fubm90IGJlIHVzZWQKLXVubGVzcyBpdCBoYXMgYXQgbGVhc3Qgb25lIHZlcnNpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L3NwYW4+IiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldCBpZD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkZvcm1HZW4gQ29yZTwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgIDxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkVuYWJsZXMgZ2VuZXJhdGlvbiBvZiBIVE1MIGZvcm1zIGJhc2VkIG9uIFhNTCBkZWZpbml0aW9uIGZpbGVzLjwvc3Bhbj4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+MS4wPC9zcGFuPiIvJmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0IGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5mb3JtZ2VuLmV4dDwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5Gb3JtR2VuIEV4dGVuc2lvbnM8L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICA8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FbmFibGVzIGFkZGl0aW9uYWwgRm9ybUdlbiB3aWRnZXRzLjwvc3Bhbj4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gIAotJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+SW5zZXJ0IHRoZSBhYm92ZSBjb2RlIGludG8geW91ciBwbHVnaW4ueG1sIGZpbGUgYW5kIGxldHMgc2VlIGl0IGluIGFjdGlvbi4KLUxhdW5jaCBFY2xpcHNlIHdpdGggeW91ciBGb3JtR2VuIHBsdWdpbiBhbmQgdGhlbiBvcGVuIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0Ci13aXphcmQuIE1ha2Ugc3VyZSB0aGF0IDxjb2RlPiZsdDtub25lJmd0OzwvY29kZT4gaXMgc2VsZWN0ZWQgaW4gdGhlIFRhcmdldCBSdW50aW1lCi1maWVsZCBvbiB0aGUgZmlyc3QgcGFnZSBhbmQgZ28gdG8gdGhlIHNlY29uZCBwYWdlLiBZb3Ugc2hvdWxkIHNlZSBhIHNjcmVlbiB0aGF0Ci1sb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuIE5vdGUgdGhhdCB0aGUgRm9ybUdlbiBmYWNldHMgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkCi1hcmUgZGlzcGxheWVkLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDEuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJzcGVjaWZ5aW5nLmNvbnN0cmFpbnRzIj4zLiBTcGVjaWZ5aW5nIENvbnN0cmFpbnRzPC9hPjwvaDI+Ci0KLTxwPk9uZSBvZiB0aGUgcHJvYmxlbXMgd2l0aCB3aGF0IHdlIGhhdmUgc28gZmFyIGlzIHRoYXQgdGhlIEZvcm1HZW4gZmFjZXRzCi1hcHBlYXIgaW4gb3RoZXIgbW9kdWxlIHByb2plY3Qgd2l6YXJkcyBzdWNoIGFzIHRoZSBFSkIgUHJvamVjdCBXaXphcmQuIFRoYXQsIG9mCi1jb3Vyc2UsIG1ha2VzIG5vIHNlbnNlIHNpbmNlIEZvcm1HZW4gaXMgc2VydmxldC1iYXNlZCB0ZWNobm9sb2d5IGFuZCBzbyBpcyBvbmx5Ci1hcHBsaWNhYmxlIHRvIEoyRUUgd2ViIGFwcGxpY2F0aW9ucy4gVG8gc29sdmUgdGhpcyBwcm9ibGVtIHdlIHdpbGwgdXNlIHRoZSAKLWNvbnN0cmFpbnQgbWVjaGFuaXNtIHRvIHNwZWNpZnkgdGhlIGRlcGVuZGVuY2llcy48L3A+Ci0KLTxwPkhlcmUgaXMgd2hhdCB0aGF0IHBhcnQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgbG9va3MgbGlrZTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPjxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9zcGFuPgotICAgICZsdDtjb25zdHJhaW50Jmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICAgICA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXTwvc3Bhbj4KLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotCi08c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXSA9PC9zcGFuPgotICAmbHQ7cmVxdWlyZXMgZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZS1saW5rIj57PGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24uZXhwcjwvYT59PC9zcGFuPjwvc3Bhbj4iIHNvZnQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e2Jvb2xlYW59PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPm9yPC9zcGFuPgotICAmbHQ7Y29uZmxpY3RzIGZhY2V0PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj48c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUtbGluayI+ezxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uLmV4cHI8L2E+fTwvc3Bhbj48L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDtjb25mbGljdHMgZ3JvdXA9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDthbmQmZ3Q7Ci0gICAgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5bZXhwcl08L3NwYW4+IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvYW5kJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPm9yPC9zcGFuPgotICAmbHQ7b3ImZ3Q7Ci0gICAgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5bZXhwcl08L3NwYW4+IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvb3ImZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+QXMgeW91IGNhbiBzZWUsIHRoZSBjb25zdHJhaW50IGlzIGFuIGV4cHJlc3Npb24gdHJlZSBhbmQgeW91IGhhdmUgZm91cgotb3BlcmF0b3JzIGF0IHlvdXIgZGlzcG9zYWwuIExldHMgZ28gb3ZlciB0aGVtIG9uZSBieSBvbmUuPC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+Ci08cD48Yj5yZXF1aXJlczwvYj48L3A+Ci0KLTxwPlRoZSA8Y29kZT5yZXF1aXJlczwvY29kZT4gb3BlcmF0b3IgaXMgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIG9mIGFsbCB0aGUgb3BlcmF0b3JzLiAKLUl0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlcGVuZGVuY3kgb24gYW5vdGhlciBmYWNldC4gSWYgdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+Ci1hdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYW55IHZlcnNpb24gb2YgdGhlIHJlZmVyZW5jZWQgZmFjZXQgd2lsbCBzYXRpc2Z5Ci10aGUgY29uc3RyYWludC4gSWYgb25seSBzcGVjaWZpYyB2ZXJzaW9ucyB3aWxsIGRvLCB0aGUgPGNvZGU+dmVyc2lvbjwvY29kZT4gCi1hdHRyaWJ1dGUgY2FuIGNvbnRhaW4gYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi48L3A+Ci0KLTxwPlRoZSA8Y29kZT5zb2Z0PC9jb2RlPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsIGtpbmQgb2YgYQotZGVwZW5kZW5jeS4gRmFjZXQgc2VsZWN0aW9uIHdpbGwgbm90IGJlIHByZXZlbnRlZCBpZiB0aGUgZGVwZW5kZW5jeSBpcyBub3QKLW1ldCwgYnV0IGlmIHRoZSBkZXBlbmRlbmN5IGlzIG1ldCwgdGhlIGZhY2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgaW5zdGFsbGVkCi1hZnRlciB0aGUgcmVmZXJlbmNlZCBmYWNldC48L3A+Ci0KLTxwPjxiPmNvbmZsaWN0czwvYj48L3A+Ci0KLTxwPlRoZSA8Y29kZT5jb25mbGljdHM8L2NvZGU+IGNvbnN0cmFpbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkZWNsYXJpbmcKLWZhY2V0IHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGlmIGluc3RhbGxlZCBpbnRvIHRoZSBzYW1lIHByb2plY3QgYXMgcmVmZXJlbmNlZAotZmFjZXRzLiBUaGUgPGNvZGU+Y29uZmxpY3RzPC9jb2RlPiBjb25zdHJhaW50IGNvbWVzIGluIHR3byBmbGF2b3JzLiBZb3UgY2FuCi1laXRoZXIgc3BlY2lmeSBhIGNvbmZsaWN0IHdpdGggYSBzaW5nbGUgZmFjZXQgb3Igd2l0aCBhIGdyb3VwIG9mIGZhY2V0cy48L3A+Ci0KLTxwPldoYXQgYXJlIGdyb3VwcyBvZiBmYWNldHM/IEZhY2V0IGdyb3VwcyBhcmUgYSB3YXkgdG8gZGVzaWduYXRlIGEgY29uZmxpY3Qgd2l0aAotYSBjZXJ0YWluIGNsYXNzIG9mIGZhY2V0cyB3aXRob3V0IGhhdmluZyB0byBsaXN0IGFsbCBvZiB0aGUgZmFjZXRzIGV4cGxpY2l0bHkuCi1Gb3IgaW5zdGFuY2UsIHRoZSBXVFAgbW9kdWxlIGZhY2V0cyBhbGwgYmVsb25nIHRvIHRoZSAibW9kdWxlcyIgZ3JvdXAuIFRoZXkgYWxzbwotZWFjaCBkZWNsYXJlIGEgY29uZmxpY3Qgd2l0aCB0aGUgIm1vZHVsZXMiIGdyb3VwLiBUaGlzIHByZXZlbnRzIHR3byBtb2R1bGUgZmFjZXRzCi1mcm9tIGJlaW5nIGluc3RhbGxlZCBpbnRvIHRoZSBzYW1lIHByb2plY3QuIEJ5IGRlY2xhcmluZyBhIGNvbmZsaWN0IHdpdGggYQotZ3JvdXAgd2hvc2UgbWVtYmVyc2hpcCBjYW4gZXhwYW5kIGFzIG5lY2Vzc2FyeSwgdGhpcmQgcGFydGllcyBjYW4gYWRkIG1vZHVsZQotZmFjZXRzIG9uIHRvcCBvZiBXVFAgYW5kIGhhdmUgdGhlIG5ldyBmYWNldHMgaW50ZXJhY3QgY29ycmVjdGx5IHdpdGggdGhlCi1idWlsdC1pbiBtb2R1bGUgZmFjZXRzLjwvcD4KLQotPHA+QSBmYWNldCBncm91cCBpcyBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGEgZmFjZXQgZGVjbGFyZXMgZ3JvdXAgbWVtYmVyc2hpcC4KLUhlcmUgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZm9yIGRlY2xhcmluZyBncm91cCBtZW1iZXJzaGlwOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0gICAgJmx0O2dyb3VwLW1lbWJlciBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci08L3ByZT4KLTwvZGl2PgotCi08cD48Yj5hbmQgJmFtcDsgb3I8L2I+Ci0KLTxwPlRoZSA8Y29kZT5hbmQ8L2NvZGU+ICZhbXA7IDxjb2RlPm9yPC9jb2RlPiBjb25zdHJhaW50cyBhcmUgdXNlZCB0byBwZXJmb3JtIAotbG9naWNhbCBjb25qdW5jdGlvbiBhbmQgZGlzanVuY3Rpb24gb3ZlciB0aGVpciBvcGVyYW5kcy4gQWx0aG91Z2ggaXQgaXMgbGVnYWwKLWZvciB0aGVzZSBvcGVyYXRvcnMgdG8gaGF2ZSBvbmx5IG9uZSBvcGVyYW5kLCB0eXBpY2FsbHkgdGhleSB3aWxsIGhhdmUgdHdvIG9yCi1tb3JlLjwvcD4KLTwvZGl2PgotCi08cD5XZSBjYW4gbm93IHNwZWNpZnkgdGhlIGNvbnN0cmFpbnRzIGZvciB0aGUgRm9ybUdlbiBmYWNldHMuIFRoZSBmYWNldCBpZCB0aGF0Ci1tYXJrcyBhIHByb2plY3QgYXMgYSBKMkVFIHdlYiBtb2R1bGUgaXMgPGNvZGU+anN0LndlYjwvY29kZT4uIFdlIHdpbGwgc2V0dXAKLWEgZGVwZW5kZW5jeSBvbiBpdCBmcm9tIHRoZSA8Y29kZT5mb3JtZ2VuLmNvcmU8L2NvZGU+IGZhY2V0LiBUaGUKLTxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPiBmYWNldCBjYW4gdGhlbiBkZXBlbmQgb24gdGhlIDxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPgotZmFjZXQuIFRoYXQgbGF0dGVyIGNvbnN0cmFpbnQgd2lsbCBlbnN1cmUgdGhhdCB0aGUgRm9ybUdlbiBFeHRlbnNpb25zCi1hcmUgbm90IGluc3RhbGxlZCB3aXRob3V0IGluc3RhbGxpbmcgRm9ybUdlbiBDb3JlLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGlkPSJmb3JtZ2VuLmNvcmUiIHZlcnNpb249IjEuMCImZ3Q7PC9zcGFuPgotICAgICZsdDtjb25zdHJhaW50Jmd0OwotICAgICAgJmx0O3JlcXVpcmVzIGZhY2V0PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC53ZWI8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjIuMiwyLjMsMi40PC9zcGFuPiIvJmd0OwotICAgICZsdDsvY29uc3RyYWludCZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gaWQ9ImZvcm1nZW4uZXh0IiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y29uc3RyYWludCZndDsKLSAgICAgICZsdDtyZXF1aXJlcyBmYWNldD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjEuMDwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDsKLSAgCi0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+PC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgY29kZSBpcyBhZGRlZCwgdGhlIEZvcm1HZW4gZmFjZXRzIHNob3VsZCBvbmx5IGFwcGVhciBpbiB0aGUKLUR5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvcD4KLQotPGgyPjxhIG5hbWU9ImltcGxlbWVudGluZy5hY3Rpb25zIj40LiBJbXBsZW1lbnRpbmcgQWN0aW9uczwvYT48L2gyPgotCi08cD5MZXQncyBub3cgdHJ5IHNlbGVjdGluZyB0aGUgRm9ybUdlbiBDb3JlIGZhY2V0IG9uIHRoZSBmYWNldHMgc2VsZWN0aW9uIHBhZ2UKLW9mIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC4gSWYgeW91IGRvIHRoYXQsIHlvdSBzaG91bGQgc2VlIHRoZQotZm9sbG93aW5nIGVycm9yIG1lc3NhZ2UgYXBwZWFyLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDIuZ2lmIi8+PC9kaXY+Ci0KLTxwPlRoaXMgZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYmVjYXVzZSB0aGUgaW5zdGFsbCBhY3Rpb24gaGFzIG5vdCBiZWVuCi1pbXBsZW1lbnRlZCBmb3IgdGhpcyBmYWNldC4gV2hhdCdzIGFuIGFjdGlvbj8gQW4gYWN0aW9uIGlzIGFuIG9wZXJhdGlvbiB0aGF0IGEKLXVzZXIgY2FuIHBlcmZvcm0gb24gYSBmYWNldC4gVGhlcmUgYXJlIHRocmVlIGFjdGlvbiB0eXBlcyA8Y29kZT5JTlNUQUxMPC9jb2RlPiwKLTxjb2RlPlVOSU5TVEFMTDwvY29kZT4sIGFuZCA8Y29kZT5WRVJTSU9OX0NIQU5HRTwvY29kZT4uIFdlIHdpbGwgbm93IGltcGxlbWVudAotdGhlIGluc3RhbGwgYWN0aW9ucyBmb3IgdGhlIEZvcm1HZW4gZmFjZXRzLjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0gICZsdDthY3Rpb24gaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiBmYWNldD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIgdHlwZT0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5JTlNUQUxMfFVOSU5TVEFMTHxWRVJTSU9OX0NIQU5HRTwvc3Bhbj4iJmd0OwotICAgICZsdDtkZWxlZ2F0ZSBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlfTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZhbHVlPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7L2FjdGlvbiZndDsKLTxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTx1bD4KLQotICA8bGk+PHA+VGhlIHZlcnNpb24gYXR0cmlidXRlIGNhbiBjb250YWluIGEgc2luZ2xlIHZlcnNpb24gb3IgYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi4KLSAgICBJdCBjYW4gYWxzbyBiZSBvbWl0dGVkIGlmIHRoZSBhY3Rpb24gYXBwbGllcyB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIGZhY2V0LjwvcD48L2xpPgotICAgIAotICA8bGk+PHA+VGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmcmFtZXdvcmsKLSAgICB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb25lIHVzaW5nIHRoZSBmb2xsb3dpbmcgcGF0dGVybjo8L3A+Ci0gICAgPHA+PGNvZGU+W2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdKCNbcHJvcC1uYW1lXT1bcHJvcC12YWx1ZV0pKjwvY29kZT48L3A+Ci0gICAgPHA+QXMgeW91IGNhbiBzZWUsIGl0IGlzIGJldHRlciB0byBwcm92aWRlIGFuIGV4cGxpY2l0IGlkIHJhdGhlciB0aGFuIGxldHRpbmcKLSAgICB0aGUgZnJhbWV3b3JrIGdlbmVyYXRlIGl0LiBMYXRlciBpbiB0aGUgdHV0b3JpYWwgd2Ugd2lsbCBjb3ZlciBleHRlbnNpb24KLSAgICBwb2ludHMgdGhhdCBtYWtlIHJlZmVyZW5jZXMgdG8gYWN0aW9uIGlkcy48L3A+Ci0gIAotICA8bGk+PHA+VGhlIDxjb2RlPiZsdDthY3Rpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBhbHNvIGJlIGVtYmVkZWQgaW5zaWRlIHRoZQotICAgIDxjb2RlPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LiBJbiB0aGF0IGNhc2UsIHRoZQotICAgIDxjb2RlPmZhY2V0PC9jb2RlPiBhbmQgPGNvZGU+dmVyc2lvbjwvY29kZT4gYXR0cmlidXRlcyBzaG91bGQgYmUgb21pdHRlZC4KLSAgICBOb3RlIHRoYXQgaWYgdGhlIHNhbWUgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24gYXBwbGllcyB0byBtdWx0aXBsZSBmYWNldCAKLSAgICB2ZXJzaW9ucywgaXQgaXMgYmV0dGVyIHRvIHByb3ZpZGUgYSBzaW5nbGUgYWN0aW9uIGRlY2xhcmF0aW9uIGV4dGVybmFsbHkuCi0gICAgVGhpcyBhbGxvd3MgdGhlIGZyYW1ld29yayB0byBwZXJmb3JtIGNlcnRhaW4ga2luZHMgb2Ygb3B0aW1pemF0aW9uczwvcD48L2xpPgotICAgIAotICA8bGk+PHA+Rm9yIHRoZSA8Y29kZT5WRVJTSU9OX0NIQU5HRTwvY29kZT4gYWN0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byByZXN0cmljdAotICAgIHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoZSBhY3Rpb24gZGVmaW5pdGlvbiB3aXRoIHJlZ2FyZHMgdG8gdGhlIHN0YXJ0aW5nCi0gICAgdmVyc2lvbi4gVG8gZG8gdGhhdCwgc2ltcGx5IHNwZWNpZnkgImZyb20udmVyc2lvbnMiIHByb3BlcnR5IGluIHRoZSBhY3Rpb24KLSAgICBkZWZpbml0aW9uLiBUaGUgdmFsdWUgaXMgYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi4KLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmcmFtZXdvcmsgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGVsZWdhdGUKLSAgICBpcyBjYXBhYmxlIG9mIGNvbnZlcnRpbmcgZnJvbSBhbnkgc3RhcnRpbmcgdmVyc2lvbi48L3A+PC9saT4KLSAgICAKLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgbG9naWMgYXNzb2NpYXRlZCB3aXRoCi0gKiBhIHBhcnRpY3VsYXIgZXZlbnQgaW4gcHJvamVjdCBmYWNldCdzIGxpZmUgY3ljbGUsIHN1Y2ggYXMgaW5zdGFsbCBvciAKLSAqIHVuaW5zdGFsbC4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSURlbGVnYXRlIAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBtZXRob2QgdGhhdCdzIGNhbGxlZCB0byBleGVjdXRlIHRoZSBkZWxlZ2F0ZS4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gcHJvamVjdCB0aGUgd29ya3NwYWNlIHByb2plY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHRoaXMgZGVsZWdhdGUgaXMgaGFuZGxpbmc7IHRoaXMKLSAgICAgKiAgIGlzIHVzZWZ1bCB3aGVuIHNoYXJpbmcgdGhlIGRlbGVnYXRlIGFtb25nIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgICAgKiAgIHByb2plY3QgZmFjZXQgb3IgZXZlbiBkaWZmZXJlbnQgcHJvamVjdCBmYWNldHMKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGVmYXVsdHMKLSAgICAgKiAgIHNob3VsZCBiZSB1c2VkCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcGFyYW08L3NwYW4+IG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkB0aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24gaWYgdGhlIGRlbGVnYXRlIGZhaWxzIGZvciBhbnkgcmVhc29uCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnZvaWQ8L3NwYW4+IGV4ZWN1dGUoIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb247Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5MZXQncyBub3cgZGl2ZSBpbiBhbmQgaW1wbGVtZW50IHRoZSBpbnN0YWxsIGRlbGVnYXRlcyBmb3IgdGhlIEZvcm1HZW4gZmFjZXRzLgotVGhlIDxjb2RlPmZvcm1nZW4uY29yZTwvY29kZT4gZmFjZXQgc2hvdWxkIChhKSBjb3B5IDxjb2RlPmZvcm1nZW4tY29yZS5qYXI8L2NvZGU+Ci1pbnRvIHRoZSBwcm9qZWN0J3MgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeSwgYW5kIChiKSByZWdpc3RlciB0aGUKLUZvcm1HZW4gc2VydmxldCBpbiA8Y29kZT53ZWIueG1sPC9jb2RlPi4gVGhlIDxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPiBmYWNldCBzaG91bGQKLWNvcHkgdGhlIDxjb2RlPmZvcm1nZW4tZXh0LmphcjwvY29kZT4gaW50byB0aGUgcHJvamVjdCdzIDxjb2RlPldFQi1JTkYvbGliPC9jb2RlPgotZGlyZWN0b3J5LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZm9ybWdlbi5jb3JlIiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7YWN0aW9uIHR5cGU9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+SU5TVEFMTDwvc3Bhbj4iJmd0OwotICAgICAgJmx0O2RlbGVnYXRlIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2FjdGlvbiZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9zcGFuPgotCi0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZvcm1nZW4uZXh0IiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7YWN0aW9uIHR5cGU9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+SU5TVEFMTDwvc3Bhbj4iJmd0OwotICAgICAgJmx0O2RlbGVnYXRlIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlPC9zcGFuPiIvJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0gIAotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IGNvbS5mb3JtZ2VuLmVjbGlwc2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJRGVsZWdhdGUKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gZXhlY3V0ZSggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAyICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dHJ5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZvbGRlciB3ZWJJbmZMaWIgPSBVdGlscy5nZXRXZWJJbmZMaWJEaXIoIHBqICk7Ci0KLSAgICAgICAgICAgIFV0aWxzLmNvcHlGcm9tUGx1Z2luKCBuZXcgUGF0aCggImxpYnMvZm9ybWdlbi1jb3JlLmphciIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJJbmZMaWIuZ2V0RmlsZSggImZvcm1nZW4tY29yZS5qYXIiICkgKTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLQotICAgICAgICAgICAgVXRpbHMucmVnaXN0ZXJGb3JtR2VuU2VydmxldCggcGogKTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbGx5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5FeHRGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJRGVsZWdhdGUKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gZXhlY3V0ZSggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dHJ5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZvbGRlciB3ZWJJbmZMaWIgPSBVdGlscy5nZXRXZWJJbmZMaWJEaXIoIHBqICk7Ci0KLSAgICAgICAgICAgIFV0aWxzLmNvcHlGcm9tUGx1Z2luKCBuZXcgUGF0aCggImxpYnMvZm9ybWdlbi1leHQuamFyIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkluZkxpYi5nZXRGaWxlKCAiZm9ybWdlbi1leHQuamFyIiApICk7Ci0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWxseTwvc3Bhbj4KLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGluc3RhbGwgYWN0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWxlY3QKLXRoZSBGb3JtR2VuIGZhY2V0cyBvbiB0aGUgRmFjZXRzIFNlbGVjdGlvbiBQYWdlIG9mIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IFdpemFyZAotd2l0aG91dCBnZXR0aW5nIGFueSBlcnJvciBtZXNzYWdlcy4gWW91IHNob3VsZCBhbHNvIGJlIGFibGUgdG8gY29tcGxldGUgdGhlCi1wcm9qZWN0IGNyZWF0aW9uIGFuZCBzZWUgdGhlIGZvbGxvd2luZyBoaWdobGlnaHRlZCBhcnRpZmFjdHMgaW4gdGhlIG5ldyBwcm9qZWN0LgotVGhlc2UgYXJ0aWZhY3RzIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBGb3JtR2VuIGZhY2V0IGluc3RhbGwgZGVsZWdhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDMuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJjcmVhdGluZy5jYXRlZ29yaWVzIj41LiBDcmVhdGluZyBDYXRlZ29yaWVzPC9hPjwvaDI+Ci0KLTxwPlByb2plY3QgZmFjZXRzIGNhbiBiZSBncm91cGVkIGludG8gY2F0ZWdvcmllcyBpbiBvcmRlciB0byBwcm92aWRlIHRoZSAib25lCi1jbGljayIgZXhwcmllbmNlIGZvciBub3ZpY2UgdXNlcnMgYW5kIHJldGFpbiB0aGUgZmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIGFkdmFuY2VkIAotdXNlcnMuIFlvdSBhcmUgdG9sZCB0aGF0IG1vc3Qgb2YgRm9ybUdlbiB1c2VycyBhbHdheXMgYWRkIGJvdGggb2YgdGhlIGphcnMgdG8KLXRoZWlyIHdlYiBhcHBzLiBUaGVzZSB1c2VycyB3b3VsZCBiZW5lZml0IGZyb20gaGF2aW5nIHRoZSBGb3JtR2VuIGZhY2V0cyBncm91cGVkCi1pbnRvIGEgY2F0ZWdvcnkgYW5kIHNvIHdlIHdpbGwgZG8ganVzdCB0aGF0LjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0gICZsdDtjYXRlZ29yeSBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICAmbHQ7L2NhdGVnb3J5Jmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0gICAgJmx0O2NhdGVnb3J5Jmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9jYXRlZ29yeSZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7PC9zcGFuPgotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHA+V2UgY2FuIG5vdyBjcmVhdGUgYSBjYXRlZ29yeSBhcm91bmQgdGhlIEZvcm1HZW4gZmFjZXRzLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0KLSAgJmx0O2NhdGVnb3J5IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+IiZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5Gb3JtR2VuPC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+RW5hYmxlcyBnZW5lcmF0aW9uIG9mIEhUTUwgZm9ybXMgYmFzZWQgb24gWE1MIGRlZmluaXRpb24gZmlsZXMuPC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O3Byb2plY3QtZmFjZXQgaWQ9ImZvcm1nZW4uY29yZSImZ3Q7PC9zcGFuPgotICAgICZsdDtjYXRlZ29yeSZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+Jmx0Oy9jYXRlZ29yeSZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0Ozwvc3Bhbj4KLQotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldCBpZD0iZm9ybWdlbi5leHQiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y2F0ZWdvcnkmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5mb3JtZ2VuLmNhdGVnb3J5PC9zcGFuPiZsdDsvY2F0ZWdvcnkmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0KLTxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGFib3ZlIGNoYW5nZSBoYXMgYmVlbiBwdXQgaW4gcGxhY2UsIHRoZSBmYWNldHMgc2VsZWN0aW9uIHBhZ2Ugc2hvdWxkIAotbG9vayBsaWtlIHRoaXM6PC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNC5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImRlY29yYXRpbmciPjYuIERlY29yYXRpbmc8L2E+PC9oMj4KLQotPHA+Q3VzdG9tIGljb25zIGNhbiBiZSBwcm92aWRlZCBmb3IgZmFjZXRzIGFuZCBjYXRlZ29yaWVzLiBJZiBhbiBpY29uIGlzIG5vdAotcHJvdmlkZWQsIGEgZGVmYXVsdCBpY29uIGlzIHVzZWQuIFRoZSBpY29ucyBhcmUgaGVscGZ1bCBhcyBhIHdheSB0byBiZXR0ZXIKLWRpZmZlcmVudGlhdGUgZmFjZXRzIGFuZCB0byBtYWtlIHRoZW0gc3RhbmQgb3V0LjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgZXh0ZW5zaW9uIHBvaW50IGxvb2tzIGxpa2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIiZndDsKLSAgJmx0O2ltYWdlIGZhY2V0PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0O2ltYWdlIGNhdGVnb3J5PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+WW91ciBzdGFydGVyIHByb2plY3QgY2FtZSB3aXRoIHRocmVlIGljb25zIGluIHRoZSA8Y29kZT5pY29uczwvY29kZT4gZm9sZGVyLgotV2Ugd2lsbCBub3cgYXNzb2NpYXRlIHRoZW0gd2l0aCB0aGUgRm9ybUdlbiBmYWNldHMgYW5kIHRoZSBjYXRlZ29yeS48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlczwvc3Bhbj4iJmd0OwotICAmbHQ7aW1hZ2UgZmFjZXQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5pY29ucy9mb3JtZ2VuLWNvcmUuZ2lmPC9zcGFuPiIvJmd0OwotICAmbHQ7aW1hZ2UgZmFjZXQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmljb25zL2Zvcm1nZW4tZXh0LmdpZjwvc3Bhbj4iLyZndDsKLSAgJmx0O2ltYWdlIGNhdGVnb3J5PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmljb25zL2Zvcm1nZW4tY2F0LmdpZjwvc3Bhbj4iLyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgc25pcHBldCBoYXMgYmVlbiBhZGRlZCB0byB5b3VyIHBsdWdpbi54bWwgZmlsZSwgdGhlIGZhY2V0cwotc2VsZWN0aW9uIHBhZ2Ugc2hvdWxkIGxvb2sgbGlrZSB0aGlzOjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDUuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJhZGRpbmcud2l6YXJkLnBhZ2VzIj43LiBBZGRpbmcgV2l6YXJkIFBhZ2VzPC9hPjwvaDI+Ci0KLTxwPkl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBnYXRoZXIgdXNlciBpbnB1dCBwcmlvciB0byBpbnN0YWxsaW5nIGEgZmFjZXQuCi1UaGUgZnJhbWV3b3JrIGFsbG93cyBhIHNlcXVlbmNlIG9mIHdpemFyZCBwYWdlcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggZmFjZXQKLWFjdGlvbnMuIFRoZSBzdXBwbGllZCB3aXphcmQgcGFnZXMgYXJlIHNob3duIGFmdGVyIHRoZSBmYWNldHMgc2VsZWN0aW9uCi1wYWdlLiBCYXNlZCBvbiB1c2VyIGZlZWRiYWNrLCB5b3Uga25vd24gdGhhdCBGb3JtR2VuIHVzZXJzIG9mdGVuIGN1c3RvbWl6ZQotdGhlIFVSTCBwYXR0ZXJuIG9mIHRoZSBGb3JtR2VuIHNlcnZsZXQgc28geW91IHdvdWxkIGxpa2UgdG8gZ2l2ZSB0aGVtIHRoZSBhYmlsaXR5Ci10byBkbyB0aGF0IGluIHRoZSB3aXphcmQgd2hlbiB0aGUgRm9ybUdlbiBmYWNldHMgYXJlIGJlaW5nIGluc3RhbGxlZC48L3A+Ci0KLTxwPkhlcmUgaXMgd2hhdCB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlIGV4dGVuc2lvbiBwb2ludHMgbG9vayBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O2FjdGlvbiZndDs8L3NwYW4+Ci0gICAgJmx0O2NvbmZpZy1mYWN0b3J5IGNsYXNzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmNsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5PC9zcGFuPiIvJmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2FjdGlvbiZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLQotJmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXM8L3NwYW4+IiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBhY3Rpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgICAmbHQ7cGFnZSBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklGYWNldFdpemFyZFBhZ2V9PC9zcGFuPiIvPiA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigxIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7L3dpemFyZC1wYWdlcyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OyAgCi08L3ByZT4KLTwvZGl2PgotCi08cD5PbmUgdGhpbmcgdG8gbm90ZSBoZXJlIGlzIHRoYXQgaW4gb3JkZXIgdG8gZW5hYmxlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUKLWZhY2V0IGFjdGlvbiBkZWxlZ2F0ZSBhbmQgdGhlIHdpemFyZCBwYWdlcywgd2UgZ28gYmFjayB0byB0aGUgYWN0aW9uIGRlY2xhcmF0aW9uCi1hbmQgcHJvdmlkZSBhbiBhY3Rpb24gY29uZmlnIGZhY3RvcnkuIFRoZSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZmFjdG9yeSBpcyAKLXBvcHVsYXRlZCBieSB0aGUgd2l6YXJkIHBhZ2VzIGFuZCBpcyByZWFkIGJ5IHRoZSBhY3Rpb24gZGVsZWdhdGUuIE5vIHJlc3RyaWN0aW9ucwotYXJlIHBsYWNlZCBvbiB0aGUgc2hhcGUgb2YgdGhlIGNvbmZpZyBvYmplY3QuIFlvdSBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBhIGN1c3RvbQotY2xhc3Mgb3IgeW91IGNhbiB1c2UgYSBzb21ldGhpbmcgZ2VuZXJpYyBsaWtlIDxjb2RlPmphdmEudXRpbC5IYXNoTWFwPC9jb2RlPi48L3A+Ci0KLTxwPkFub3RoZXIgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IHRoZSA8Y29kZT53aXphcmRQYWdlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IHJlZmVycwotdG8gdGhlIGFjdGlvbnMgYnkgdGhlaXIgaWRzLCBzbyBpdCBiZWNvbWVzIG1vcmUgaW1wb3J0YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeQotdGhlIGlkIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGZyYW1ld29yayBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIG9uZS48L3A+Ci0KLTxwPkhlcmUgYXJlIHRoZSBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGFib3ZlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWE6PC9wPiAKLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBtZXRob2QgZm9yIGNyZWF0aW5nIAotICogYSBjb25maWcgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUgZmFjZXQgYWN0aW9uCi0gKiBkZWxlZ2F0ZS4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUFjdGlvbkNvbmZpZ0ZhY3RvcnkKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZhY2V0IGFjdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdC4gVGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICogb2JqZWN0IHNob3VsZCBpZGVhbGx5IGJlIHBvcHVsYXRlZCB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiBhIG5ldyBmYWNldCBhY3Rpb24gY29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkB0aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIGNyZWF0aW5nIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqLzwvc3Bhbj4KLSAgICAKLSAgICBPYmplY3QgY3JlYXRlKCkgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhyb3dzPC9zcGFuPiBDb3JlRXhjZXB0aW9uOwotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIHdpemFyZCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggcHJvamVjdAotICogZmFjZXQgYWN0aW9ucy4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUZhY2V0V2l6YXJkUGFnZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5leHRlbmRzPC9zcGFuPiBJV2l6YXJkUGFnZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHdpemFyZAotICAgICAqIGNvbnRleHQgdG8gdGhlIHdpemFyZCBwYWdlLiBUaGUgd2l6YXJkIGNvbnRleHQgY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQKLSAgICAgKiBhYm91dCBvdGhlciBhY3Rpb25zIGJlaW5nIGNvbmZpZ3VyZWQgYnkgdGhlIHdpemFyZC4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gY29udGV4dCB0aGUgd2l6YXJkIGNvbnRleHQKLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gc2V0V2l6YXJkQ29udGV4dCggSVdpemFyZENvbnRleHQgY29udGV4dCApOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGFjdGlvbiBjb25maWcKLSAgICAgKiBvYmplY3QgdGhhdCB0aGUgd2l6YXJkIHBhZ2Ugc2hvdWxkIHNhdmUgdXNlciBzZWxlY3Rpb24gaW50by4gVGhlCi0gICAgICogcG9wdWxhdGVkIGNvbmZpZyBvYmplY3Qgd2lsbCB0aGVuIGJlIHBhc3NlZCB0byB0aGUgYWN0aW9uIGRlbGVnYXRlLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBjb25maWcgdGhlIGFjdGlvbiBjb25maWcgb2JqZWN0Ci0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnZvaWQ8L3NwYW4+IHNldENvbmZpZyggT2JqZWN0IGNvbmZpZyApOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBoYXMgcHJlc3NlZCB0aGUgPGNvZGU+RmluaXNoPC9jb2RlPgotICAgICAqIGJ1dHRvbi4gSXQgYWxsb3dzIHRoZSB3aXphcmQgcGFnZSB0byB0cmFuc2ZlciB1c2VyIHNlbGVjdGlvbiBpbnRvIHRoZQotICAgICAqIGNvbmZpZyBvYmplY3QuIEFsdGVybmF0aXZlLCBpbnN0ZWFkIG9mIHVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgd2l6YXJkCi0gICAgICogcGFnZSBjb3VsZCB1cGRhdGUgdGhlIG1vZGVsIG9uIHRoZSBmbHkgYXMgdGhlIHVzZXIgaXMgbWFraW5nIGNoYW5nZXMuCi0gICAgICovPC9zcGFuPgotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCk7Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5XZSB3aWxsIG5vdyBpbXBsZW1lbnQgYSB3aXphcmQgcGFnZSBmb3IgdGhlIDxjb2RlPmZhY2V0LmNvcmU8L2NvZGU+IGZhY2V0Ci1pbnN0YWxsIGFjdGlvbi4gVGhlIHdpemFyZCBwYWdlIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0Ci1zZXJ2bGV0IFVSTCBwYXR0ZXJuIGZvciB0aGUgRm9ybUdlbiBzZXJ2bGV0LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZm9ybWdlbi5jb3JlIiB2ZXJzaW9uPSIxLjAiJmd0OwotICAgICZsdDthY3Rpb24gdHlwZT0iSU5TVEFMTCI8L3NwYW4+IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZS5pbnN0YWxsPC9zcGFuPiI8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mZ3Q7PC9zcGFuPgotICAgICAgJmx0O2NvbmZpZy1mYWN0b3J5IGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWckRmFjdG9yeTwvc3Bhbj4iLyZndDsKLSAgICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2FjdGlvbiZndDsKLSAgJmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci0KLSZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzPC9zcGFuPiImZ3Q7Ci0gICZsdDt3aXphcmQtcGFnZXMgYWN0aW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZS5pbnN0YWxsPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3BhZ2UgY2xhc3M9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbFBhZ2U8L3NwYW4+Ii8+Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7ICAKLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHJpdmF0ZTwvc3Bhbj4gU3RyaW5nIHVybFBhdHRlcm4gPSA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iKi5mb3JtIjwvc3Bhbj47Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWM8L3NwYW4+IFN0cmluZyBnZXRVcmxQYXR0ZXJuKCkKLSAgICB7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnJldHVybiB0aGlzPC9zcGFuPi51cmxQYXR0ZXJuOwotICAgIH0KLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBzZXRVcmxQYXR0ZXJuKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gU3RyaW5nIHVybFBhdHRlcm4gKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHN0YXRpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRmFjdG9yeSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJQWN0aW9uQ29uZmlnRmFjdG9yeQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljPC9zcGFuPiBPYmplY3QgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cmV0dXJuIG5ldzwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkFic3RyYWN0RmFjZXRXaXphcmRQYWdlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsUGFnZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5leHRlbmRzPC9zcGFuPiBBYnN0cmFjdEZhY2V0V2l6YXJkUGFnZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnByaXZhdGU8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnIGNvbmZpZzsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcml2YXRlPC9zcGFuPiBUZXh0IHVybFBhdHRlcm5UZXh0RmllbGQ7Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWM8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsUGFnZSgpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5zdXBlcjwvc3Bhbj4oIDxzcGFuIGNsYXNzPSJqYXZhLWxpdGVyYWwiPiJmb3JtZ2VuLmNvcmUuZmFjZXQuaW5zdGFsbC5wYWdlIjwvc3Bhbj4gKTsKLQotICAgICAgICBzZXRUaXRsZSggPHNwYW4gY2xhc3M9ImphdmEtbGl0ZXJhbCI+IkZvcm1HZW4gQ29yZSI8L3NwYW4+ICk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iQ29uZmlndXJlIHRoZSBGb3JtR2VuIHNlcnZsZXQuIjwvc3Bhbj4gKTsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gY3JlYXRlQ29udHJvbCggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IENvbXBvc2l0ZSBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IENvbXBvc2l0ZSBjb21wb3NpdGUgPSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5uZXc8L3NwYW4+IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5uZXc8L3NwYW4+IEdyaWRMYXlvdXQoIDEsIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZhbHNlPC9zcGFuPiApICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IExhYmVsIGxhYmVsID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCggPHNwYW4gY2xhc3M9ImphdmEtbGl0ZXJhbCI+IlVSTCBQYXR0ZXJuOiI8L3NwYW4+ICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZCA9IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gVGV4dCggY29tcG9zaXRlLCBTV1QuQk9SREVSICk7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRoaXM8L3NwYW4+LnVybFBhdHRlcm5UZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRoaXM8L3NwYW4+LnVybFBhdHRlcm5UZXh0RmllbGQuc2V0VGV4dCggdGhpcy5jb25maWcuZ2V0VXJsUGF0dGVybigpICk7Ci0KLSAgICAgICAgc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IHNldENvbmZpZyggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IE9iamVjdCBjb25maWcgKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4uY29uZmlnID0gKEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi5jb25maWcuc2V0VXJsUGF0dGVybiggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZC5nZXRUZXh0KCkgKTsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcml2YXRlIHN0YXRpYzwvc3Bhbj4gR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5yZXR1cm4gbmV3PC9zcGFuPiBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICk7Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gY29tLmZvcm1nZW4uZWNsaXBzZTsKLQotPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElEZWxlZ2F0ZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IGV4ZWN1dGUoIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPnRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDIgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgezwvc3Bhbj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZyBjZmcKLSAgICAgICAgICAgICAgICA9IChGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZykgY29uZmlnOwotCi0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0Ij48c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJRm9sZGVyIHdlYkluZkxpYiA9IFV0aWxzLmdldFdlYkluZkxpYkRpciggcGogKTsKLQotICAgICAgICAgICAgVXRpbHMuY29weUZyb21QbHVnaW4oIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+bmV3PC9zcGFuPiBQYXRoKCAibGlicy9mb3JtZ2VuLWNvcmUuamFyIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkluZkxpYi5nZXRGaWxlKCAiZm9ybWdlbi1jb3JlLmphciIgKSApOwotCi0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOzwvc3Bhbj4KLQotICAgICAgICAgICAgVXRpbHMucmVnaXN0ZXJGb3JtR2VuU2VydmxldCggcGosIGNmZy5nZXRVcmxQYXR0ZXJuKCkgKTsKLQotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dCI+bW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmZpbmFsbHk8L3NwYW4+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotfTwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGFib3ZlIGNvZGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB5b3Ugc2hvdWxkIHNlZSBhbm90aGVyIHBhZ2UgYXBwZWFyCi1pbiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdCBXaXphcmQgYWZ0ZXIgdGhlIEZvcm1HZW4gZmFjZXRzIGFyZSBzZWxlY3RlZC4gVGhlCi1uZXcgcGFnZSB3aWxsIGFwcGVhciBhZnRlciB0aGUgV2ViIE1vZHVsZSBwYWdlLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi08Y29kZT5qc3Qud2ViPC9jb2RlPiBmYWNldC4gVGhhdCdzIGJlY2F1c2UgPGNvZGU+Zm9ybWdlbi5jb3JlPC9jb2RlPiBmYWNldAotZGVwZW5kcyBvbiB0aGUgPGNvZGU+anN0LndlYjwvY29kZT4gZmFjZXQuIElmIHRoaXMgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgCi13YXMgbm90IHNwZWNpZmllZCB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgdGhlc2UgcGFnZXMgd291bGQgYmUgdW5zcGVjaWZpZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNi5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImRlZmluaW5nLnByZXNldHMiPjguIERlZmluaW5nIFByZXNldHM8L2E+PC9oMj4KLQotPHA+QXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZmFjZXRzIGdyb3dzLCBpdCBiZWNvbWVzIGluY3JlYXNpbmdseSBkaWZmaWN1bHQKLWZvciB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoaWNoIGNvbWJpbmF0aW9ucyBtYWtlIHNlbnNlLiBUaGlzIGlzIHdoZXJlIHByZXNldHMKLWNvbWUgaW4uIFByZXNldHMgKG9yIENvbmZpZ3VyYXRpb25zLCBhcyB0aGV5IGFyZSByZWZlcnJlZCB0byBpbiB0aGUgVUkpIGFyZQotc2ltcGx5IGNvbWJpbmF0aW9ucyBvZiBmYWNldHMgdGhhdCBzb21lb25lIGhhcyBkZXRlcm1pbmVkIGFyZSB1c2VmdWwgaW4gY2VydGFpbgotc2l0dWF0aW9ucy4gUHJlc2V0cyBjYW4gYmUgY3JlYXRlZCBieSB0aGUgdXNlciBvciBzdXBwbGllZCB2aWEgYW4gZXh0ZW5zaW9uCi1wb2ludC48L3A+Ci0KLTxwPkhlcmUgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZm9yIGRlY2xhcmluZyBwcmVzZXRzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdGF0aWMtcHJlc2V0IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgZXh0ZW5kcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+Tm90ZSB0aGF0IGluIG9yZGVyIGZvciBhIHByZXNldCB0byBhcHBseSB0byBhIGdpdmVuIGZhY2V0ZWQgcHJvamVjdCwgdGhlCi1wcmVzZXQgbmVlZHMgdG8gaW5jbHVkZSBhbGwgb2YgdGhlIHByb2plY3QncyAiZml4ZWQgZmFjZXRzIi4gRml4ZWQgZmFjZXRzIGFyZQotdGhlIGZhY2V0cyB0aGF0IGFyZSBrZXkgdG8gdGhlIHByb3BlciBvcGVyYXRpb24gb2YgdGhhdCBwcm9qZWN0IHR5cGUgYW5kIHNvCi1jYW5ub3QgYmUgcmVtb3ZlZC4gWW91IGNhbiBpZGVudGlmeSBmaXhlZCBmYWNldHMgYnkgdGhlIGxvY2sgaWNvbi48L3A+Ci0KLTxwPkxldCdzIG5vdyBjcmVhdGUgYSBwcmVzZXQgdGhhdCBpbmNsdWRlcyBmb3JtZ2VuIGZhY2V0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0czwvc3Bhbj4iJmd0OwotICAmbHQ7c3RhdGljLXByZXNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLnByZXNldDwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ieG1sLXRleHQiPkZvcm1HZW4gV2ViIFByb2plY3Q8L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7PHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5DcmVhdGVzIGEgd2ViIHByb2plY3Qgd2l0aCBGb3JtR2VuIGZ1bmN0aW9uYWxpdHkuPC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC5qYXZhPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij41LjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC53ZWI8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjIuMjwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uZXh0PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+SGVyZSBpcyBob3cgdGhlIHByZXNldCBzaG93cyB1cCBvbiB0aGUgZmFjZXRzIHNlbGVjdGlvbiBwYWdlOjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDcuZ2lmIi8+PC9kaXY+Ci0KLTxwPlRoZSBwcmVzZXQgY2FuIGFsc28gYmUgc2VsZWN0ZWQgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgYWxsIFdUUCBwcm9qZWN0Ci1jcmVhdGlvbiB3aXphcmRzLiBIZXJlIGlzIGhvdyB0aGlzIGxvb2tzIGluIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZDo8L3A+Ci0KLTxkaXYgY2xhc3M9InNjcmVlbi1zaG90Ij48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbjA4LmdpZiIvPjwvZGl2PgotCi08aDI+PGEgbmFtZT0icnVudGltZS5tYXBwaW5ncyI+OS4gU3BlY2lmeWluZyBSdW50aW1lIFN1cHBvcnQgTWFwcGluZ3M8L2E+PC9oMj4KLQotPHA+T25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgb2YgdGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmsgaXMgdG8KLWJlIGFibGUgdG8gYWNjdXJhdGVseSBtb2RlbCB3aGV0aGVyIGEgY2VydGFpbiBzZXJ2ZXIgcnVudGltZSBzdXBwb3J0cyBhCi1naXZlbiBwcm9qZWN0LiBXZSBkbyB0aGF0IGJ5ICJtYXBwaW5nIiBwcm9qZWN0IGZhY2V0cyB0byBydW50aW1lIGNvbXBvbmVudHMKLXRoYXQgc3VwcG9ydCB0aGVtLiBJZiB0aGUgYXJ0aWZhY3RzIGNyZWF0ZWQgYnkgYSBmYWNldCB3aWxsIHJ1biBvbiBhbnkgc2VydmVyCi10aGF0IHN1cHBvcnRzIGFsbCBvZiB0aGUgZmFjZXQncyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMsIHRoZW4gdGhlIDxjb2RlPmFueTwvY29kZT4KLXdpbGRjYXJkIGNhbiBiZSB1c2VkLjwvcD4KLQotPHA+SXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGV2ZXJ5IGZhY2V0IG5lZWRzIHRvIHNwZWNpZnkgYSBzdXBwb3J0IG1hcHBpbmcgb2YKLXNvbWUga2luZC4gRmFjZXRzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbnkgc3VwcG9ydCBtYXBwaW5ncyBhcmUgdHJlYXRlZCBhcyBub3QKLXN1cHBvcnRlZCBieSBhbnkgcnVudGltZSwgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsLjwvcD4KLQotPHA+SGVyZSBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IHRoYXQncyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBzdXBwb3J0IG1hcHBpbmdzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lczwvc3Bhbj4iJmd0OwotICAmbHQ7c3VwcG9ydGVkJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBhbnk9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e2Jvb2xlYW59PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZS1saW5rIj57PGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24uZXhwcjwvYT59PC9zcGFuPjwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMSBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0Oy9zdXBwb3J0ZWQmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSA8Y29kZT4mbHQ7c3VwcG9ydGVkJmd0OzwvY29kZT4gYmxvY2sgY2FuIHJlZmVyZW5jZSBhbnkgbnVtYmVyIG9mIHJ1bnRpbWUKLWNvbXBvbmVudHMgYXMgd2VsbCBhcyBhbnkgbnVtYmVyIG9mIGZhY2V0cy4gVGhlIHNlbWFudGljcyBvZiB0aGF0IGlzIHRvIGRlY2xhcmUgCi1hcyBzdXBwb3J0ZWQgZXZlcnkgY29tYmluYXRpb24gaW4gdGhlIHJlc3VsdGluZyBjcm9zcy1wcm9kdWN0LjwvcD4gCi0KLTxwPlRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGVzIG9mIHRoZSA8Y29kZT4mbHQ7cnVudGltZS1jb21wb25lbnQmZ3Q7PC9jb2RlPiAKLWFuZCA8Y29kZT4mbHQ7ZmFjZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgb21pdHRlZCB0byBpbmNsdWRlIGFsbCB2ZXJzaW9ucy48L3A+Ci0KLTxwPlRoZSBGb3JtR2VuIGZhY2V0cyBkb24ndCBoYXZlIGFueSBzcGVjaWFsIHN1cHBvcnQgcmVxdWlyZW1lbnRzLiBUaGV5IHdpbGwgcnVuCi1vbiBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgdGhlIGoyZWUgc2VydmxldCBzcGVjLiBXZSB3aWxsIHVzZSB0aGUgPGNvZGU+YW55PC9jb2RlPgotd2lsZGNhcmQgdG8gZGVzaWduYXRlIHRoYXQuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdXBwb3J0ZWQmZ3Q7Ci0gICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGFueT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij50cnVlPC9zcGFuPiIvJmd0OwotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uZXh0PC9zcGFuPiIvJmd0OwotICAmbHQ7L3N1cHBvcnRlZCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+QWx0ZXJuYXRpdmUsIGlmIGZvciBzb21lIHJlYXNvbiB0aGUgRm9ybUdlbiBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGEgc3BlY2lmaWMKLXJ1bnRpbWUsIHN1Y2ggYXMgVG9tY2F0LCB3ZSB3b3VsZCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhlIHRoaXMgaW5zdGVhZDo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXM8L3NwYW4+IiZndDsKLSAgJmx0O3N1cHBvcnRlZCZndDsKLSAgICAmbHQ7cnVudGltZS1jb21wb25lbnQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQ8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPls1LjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDsvc3VwcG9ydGVkJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgYWJvdmUgbW9yZSByZXN0cmljdGl2ZSBzcGVjaWZpY2F0aW9uIHdpbGwgcHJldmVudCBGb3JtR2VuIGZhY2V0cyBmcm9tCi1iZWluZyBzZWxlY3RlZCBpZiB0aGUgcHJvamVjdCBpcyB0YXJnZXR0ZWQgdG8gYW55IHJ1bnRpbWUgb3RoZXIgdGhhbiBBcGFjaGUKLVRvbWNhdCA1LjAgb3IgbmV3ZXIuPC9wPgotCi08aDI+PGEgbmFtZT0ic3VtbWFyeSI+MTAuIFN1bW1hcnk8L2E+PC9oMj4KLQotPHA+SW4gdGhpcyB0dXRvcmlhbCB3ZSBjcmVhdGVkIHR3byBmdWxseS1mdW5jdGlvbmFsIHByb2plY3QgZmFjZXRzIGJ5IHNwZWNpZnlpbmcKLWNvbnN0cmFpbnRzLCBpbXBsZW1lbnRpbmcgYWN0aW9ucywgZ3JvdXBpbmcgZmFjZXRzIGludG8gY2F0ZWdvcmllcywgYW5kIGNyZWF0aW5nCi13aXphcmQgcGFnZXMgdG8gYWxsb3cgdXNlcnMgdG8gcGFyYW1ldGVyaXplIGZhY2V0IGluc3RhbGxhdGlvbi4gWW91IHNob3VsZCBub3cKLWJlIHdlbGwgcHJlcGFyZWQgdG8gY3JlYXRlIHlvdXIgb3duIGZhY2V0cy4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBub3QgY292ZXJlZAotYnkgdGhpcyB0dXRvcmlhbCBjYW4gYmUgZm91bmQgaW4gdGhlIGZvbGxvd2luZyBhcHBlbmRpeCBzZWN0aW9ucy48L3A+IAotCi08aDI+PGEgbmFtZT0iY3VzdG9tLnZlcnNpb24uY29tcGFyYXRvcnMiPkFwcGVuZGl4IEE6IEN1c3RvbSBWZXJzaW9uIENvbXBhcmF0b3JzPC9hPjwvaDI+Ci0KLTxwPlRoZSBmYWNldGVkIHByb2plY3QgZnJhbWV3b3JrIG5lZWRzIHRvIGJlIGFibGUgdG8gY29tcGFyZSBmYWNldCB2ZXJzaW9uCi1zdHJpbmdzLiBUaGUgZnJhbWV3b3JrIHN1cHBsaWVzIGEgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgdGhhdCBjYW4gaGFuZGxlCi12ZXJzaW9uIHN0cmluZ3MgZW5jb2RlZCB1c2luZyB0aGUgc3RhbmRhcmQgZGVjaW1hbCBub3RhdGlvbiAoc3VjaCBhcyAxLjIgb3IKLTUuNjYuNTUzMyksIGJ1dCBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0IHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5Ci1hIGN1c3RvbSB2ZXJzaW9uIGNvbXBhcmF0b3IuPC9wPgotCi08cD5IZXJlIGlzIGhvdyB5b3UgcGx1ZyBpbiBhIGN1c3RvbSB2ZXJzaW9uIGNvbXBhcmF0b3I6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0gICAgJmx0O3ZlcnNpb24tY29tcGFyYXRvciBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6amF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7U3RyaW5nJmd0O308L3NwYW4+Ii8mZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPldoZW4gaW1wbGVtZW50aW5nIGEgdmVyc2lvbiBjb21wYXJhdG9yIHlvdSBjYW4gZWl0aGVyIHN0YXJ0IGZyb20gc2NyYXRjaAotb3Igc3ViY2xhc3MgdGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yICg8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I8L2NvZGU+KS4KLVN1YmNsYXNzaW5nIHRoZSBkZWZhdWx0IHZlcnNpb24gY29tcGFyYXRvciBtYWtlcyBzZW5zZSBpZiB0aGUgdmVyc2lvbiBmb3JtYXQKLWRpZmZlcnMgb25seSBzbGlnaHRseSBmcm9tIHRoZSBkZWZhdWx0IGZvcm1hdCwgc3VjaCBhcyB1c2luZyBzZXBhcmF0b3JzIG90aGVyCi10aGFuIGRvdHMgb3IgaGF2aW5nIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgYXQgY2VydGFpbiBwb3NpdGlvbnMuIEhlcmUgYXJlIHRoZQotcHJvdGVjdGVkIG1ldGhvZHMgZXhwb3NlZCBieSB0aGUgPGNvZGU+RGVmYXVsdFZlcnNpb25Db21wYXJhdG9yPC9jb2RlPiBjbGFzcwotdGhhdCBhcmUgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbjo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFJldHVybnMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZQotICogdXNlZCB3aGVuIGJyZWFraW5nIHRoZSB2ZXJzaW9uIHN0cmluZyBpbnRvIHNlZ21lbnRzLiBUaGUgZGVmYXVsdAotICogaW1wbGVtZW50YXRpb24gcmV0dXJucyAiLiIuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICogCi0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycwotICovPC9zcGFuPgotICAgIAotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHJvdGVjdGVkPC9zcGFuPiBTdHJpbmcgZ2V0U2VwYXJhdG9ycygpOwotICAgIAotPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gKiBQYXJzZXMgYSBzZWdtZW50IG9mIHRoZSB2ZXJzaW9uIHN0cmluZy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGFyc2VzCi0gKiB0aGUgZmlyc3Qgc2VnbWVudCBhcyBhbiBpbnRlZ2VyIChsZWFkaW5nIHplcm9lcyBhcmUgaWdub3JlZCkgYW5kIHRoZQotICogcmVzdCBvZiB0aGUgc2VnbWVudHMgYXMgZGVjaW1hbHMgKGxlYWRpbmcgemVyb2VzIGFyZSBrZXB0KS4gU3ViY2xhc3NlcyAKLSAqIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGN1c3RvbSBwYXJzaW5nIGZvciBhbnkgbnVtYmVyIG9mIAotICogc2VnbWVudHMuCi0gKiAKLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiB2ZXJzaW9uIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nCi0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gc2VnbWVudCB0aGUgdmVyc2lvbiBzZWdtZW50Ci0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWdtZW50IGluIHRoZSB2ZXJzaW9uIHN0cmluZwotICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWdtZW50IGFzIGEge0BzZWUgQ29tcGFyYWJsZX0KLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHRocm93czwvc3Bhbj4gVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBpZiBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nCi0gKi88L3NwYW4+Ci0gICAgCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcm90ZWN0ZWQ8L3NwYW4+IENvbXBhcmFibGUgcGFyc2UoIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBTdHJpbmcgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gU3RyaW5nIHNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IGludCBwb3NpdGlvbiApCi0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhyb3dzPC9zcGFuPiBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotPC9wcmU+Ci08L2Rpdj4KLQotPGgyPjxhIG5hbWU9InZlcnNpb24uZXhwcmVzc2lvbnMiPkFwcGVuZGl4IEI6IFZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PC9oMj4KLQotPHA+QSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgYSBzeW50YXggZm9yIHNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSB2ZXJzaW9uLiBUaGUKLXZlcnNpb24gZXhwcmVzc2lvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cywgYnV0Ci15b3Ugd2lsbCBtb3N0IGxpa2VseSBmaXJzdCBlbmNvdW50ZXIgdGhlbSB3aGlsZSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT5yZXF1aXJlczwvY29kZT4gCi1jb25zdHJhaW50LjwvcD4KLQotPHA+QSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gCi1UaGUgY29tbWFzIGZ1bmN0aW9uIGFzIGFuIE9SIG9wZXJhdGlvbi4gRWFjaCBzZWdtZW50IGlzIGVpdGhlciBhIHNpbmdsZSB2ZXJzaW9uLCAKLWEgcmFuZ2UsIG9yIGEgd2lsZGNhcmQuIFJhbmdlcyBhcmUgcmVwcmVzZW50ZWQgYnkgYnJhY2tldCBhbmQgZGFzaCBub3RhdGlvbiBzdWNoIAotYXMgW3gteSkuIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUsIHdoaWxlIHRoZSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuIE9wZW4gCi1lbmRlZCByYW5nZXMgYXJlIGFsc28gc3VwcG9ydGVkLiBBIHdpbGRjYXJkIChyZXByZXNlbnRlZCBieSAnKicgY2hhcmFjdGVyKSBjYW4KLWJlIHVzZWQgdG8gbWF0Y2ggYW55IHZlcnNpb24uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHdpbGRjYXJkIHRvIG1hdGNoCi1wYXJ0IG9mIHRoZSB2ZXJzaW9uIHN0cmluZy48L3A+Ci0KLTxwPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+MS4yCi0xLjIsMS41LDMuMgotWzEuMi0zLjJdCi1bMy43LTUuMCkKLVszLjcKLTUuMCkKLTEuMixbMy4wLTQuNSksWzcuMwotKgotPC9wcmU+Ci08L2Rpdj4KLQotPGgyPjxhIG5hbWU9InByb3BlcnR5LnRlc3RlciI+QXBwZW5kaXggQzogUHJvcGVydHkgVGVzdGVyPC9hPjwvaDI+Ci0KLTxwPkEgcHJvcGVydHkgdGVzdGVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHRoYXQgYWxsb3dzCi10aGUgcHJlc2VuY2Ugb2YgdGhlIGZhY2V0IGluIGEgcHJvamVjdCB0byBiZSB0ZXN0ZWQgYnkgYW55IGV4dGVuc2lvbiBwb2ludCB0aGF0Ci13b3JrcyB3aXRoIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM8L2NvZGU+IHBhY2thZ2UuIFRoZSBtb3N0IGNvbW1vbgotdXNhZ2UgaXMgdG8gZW5hYmxlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIChzdWNoIGFzIGFjdGlvbnMgYW5kIHByb2plY3QgcHJvcGVydHkKLXBhZ2VzKS4gVGhlIHByb3BlcnR5IG5hbWUgaXMgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9jb2RlPgotYW5kIHRoZSB2YWx1ZSBpcyBlaXRoZXIgYSBmYWNldCBpZCBvciBhIGZhY2V0IGlkIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kCi1hIDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uIGV4cHJlc3Npb248L2E+LjwvcD4KLQotPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIGZhY2V0cyBwcm9wZXJ0eSB0ZXN0ZXIgdG8gY29udHJvbCBlbmFibGVtZW50IG9mCi1hIHByb2plY3QgcHJvcGVydGllcyBwYWdlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzPC9zcGFuPiImZ3Q7Ci0gICZsdDtwYWdlIAotICAgIGFkYXB0YWJsZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICBvYmplY3RDbGFzcz0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iCi0gICAgbmFtZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5Gb3JtR2VuIFByb3BlcnRpZXM8L3NwYW4+IgotICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlblByb3BlcnRpZXNQYWdlPC9zcGFuPiIKLSAgICBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZTwvc3Bhbj4iJmd0OwotICAgICZsdDtlbmFibGVkV2hlbiZndDsKLSAgICAgICZsdDt0ZXN0IAotICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+dHJ1ZTwvc3Bhbj4iCi0gICAgICAgIHByb3BlcnR5PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgIHZhbHVlPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2VuYWJsZWRXaGVuJmd0OyAgICAgICAgICAKLSAgJmx0Oy9wYWdlJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0id2l6YXJkLmNvbnRleHQiPkFwcGVuZGl4IEQ6IFdpemFyZCBDb250ZXh0PC9hPjwvaDI+Ci0KLTxwPlNvbWV0aW1lcyBpdCBkZXNpcmFibGUgdG8gYmUgYWJsZSB0byBhZGp1c3QgdGhlIGJlaGF2aW9yIG9mIGZhY2V0IGFjdGlvbiAKLXdpemFyZCBwYWdlcyBiYXNlZCBvbiB1c2VyIGlucHV0IGluIHRoZSB3aXphcmQgcGFnZXMgb2Ygb3RoZXIgZmFjZXRzLiBUaGUKLTxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gVGhlIHdpemFyZAotcGFnZSBnZXRzIGEgaGFuZGxlIG9uIDxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2Ugd2hlbiBpdCdzCi08Y29kZT5zZXRXaXphcmRDb250ZXh0PC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBXaGVuIHdyaXRpbmcgY29kZSB0aGF0IHJlbGllcwotb24gdGhlIHdpemFyZCBjb250ZXh0LCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgcG9pbnRzIHlvdSBzaG91bGQga2VlcCBpbiBtaW5kLjwvcD4KLQotPG9sPgotCi0gIDxsaT48cD5UaGUgZmFjZXQgd2hvc2UgdmFsdWUgeW91IHdpc2ggdG8gY2hlY2sgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGluc3RhbGxlZAotICAgIGluIHRoZSBwYXN0LiBJbiB0aGF0IGNhc2UgeW91IHdpbGwgbm90IGZpbmQgaXQncyBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gaW4KLSAgICB0aGUgd2l6YXJkIGNvbnRleHQuIFlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgY29uZGl0aW9uYWwgbG9naWMgdGhhdCB3aWxsCi0gICAgY29uc3VsdCB0aGUgd2l6YXJkIGNvbnRleHQgb3IgbG9va3MgYXQgcHJvamVjdCBzdGF0ZSBvbiBkaXNrLjwvcD48L2xpPgotICAgIAotICA8bGk+PHA+WW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyBwcm92aWRlZCBpbiB5b3VyCi0gICAgY29uZmlnIG9iamVjdCBmb3IgdGhlIEFQSS1vbmx5IHNjZW5hcmlvIHdoZXJlIHlvdXIgd2l6YXJkIHBhZ2Ugd2lsbCBub3QgYmUKLSAgICBpbnZvbHZlZC48L3A+Ci0gICAgCi08L29sPgotCi08cD5IZXJlIGlzIHdoYXQgdGhlIDxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UgbG9va3MgbGlrZTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gamF2YS51dGlsLlNldDsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb24uVHlwZTsKLQotPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gKiBUaGUgaW50ZXJmYWNlIGV4cG9zZWQgdG8gdGhlIGZhY2V0IGFjdGlvbiB3aXphcmQgcGFnZXMgdGhhdCBhbGxvd3MgdGhlbQotICogdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3aXphcmQgc3RhdGUuCi0gKi88L3NwYW4+Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBpbnRlcmZhY2U8L3NwYW4+IElXaXphcmRDb250ZXh0IAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgd2l6YXJkIGlzIG9wZXJhdGluZyBvbi4gSWYgdGhlCi0gICAgICogd2l6YXJkIGlzIGluIHRoZSBwcm9qZWN0IGNyZWF0aW9uIG1vZGUsIHRoZSBwcm9qZWN0IHdpbGwgbm90IHlldCBleGlzdAotICAgICAqIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSB3aXphcmQgaXMgb3BlcmF0aW5nIG9uCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBmYWNldHMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB3aXphcmQuIElmIHRoZSB3aXphcmQKLSAgICAgKiBpcyBpbiB0aGUgYWRkL3JlbW92ZSBmYWNldHMgbW9kZSAodnMuIHByb2plY3QgY3JlYXRpb24pLCB0aGlzIG1ldGhvZCB3aWxsIAotICAgICAqIHJldHVybiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIGEgcHJvamVjdCBhZnRlciBiZWluZyAKLSAgICAgKiBtb2RpZmllZCBieSB0aGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy4gCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHdpemFyZCAoZWxlbWVudCB0eXBlOgotICAgICAqICAgezxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHNlZTwvc3Bhbj4gSVByb2plY3RGYWNldFZlcnNpb259KQotICAgICAqLzwvc3Bhbj4KLSAgICAKLSAgICBTZXQgZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmFjZXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZQotICAgICAqIHdpemFyZC4gU2VlIHtAc2VlIGdldFNlbGVjdGVkUHJvamVjdEZhY2V0cygpfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuIG9ubHkgaWYgdGhlIHByb3ZpZGVkIHByb2plY3QgZmFjZXQgaXMKLSAgICAgKiAgIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgd2l6YXJkCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmJvb2xlYW48L3NwYW4+IGlzUHJvamVjdEZhY2V0U2VsZWN0ZWQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFjdGlvbnMgY3VycmVudGx5IHNwZWNpZmllZCBieSB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBzZXQgb2YgYWN0aW9ucyBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIFNldCBnZXRBY3Rpb25zKCk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogRmluZHMgdGhlIGFjdGlvbiBvZiBzcGVjaWZpZWQgdHlwZSB0aGF0IGFwcGxpZXMgdG8gdGhlIHNwZWNpZmllZCBmYWNldCwKLSAgICAgKiBpZiBzdWNoIGFjdGlvbiBleGlzdHMuIElmIHRoZSB3aXphcmQgaXMgaW4gdGhlIGFkZC9yZW1vdmUgZmFjZXRzIG1vZGUKLSAgICAgKiAodnMuIHByb2plY3QgY3JlYXRpb24pLCB5b3UgY2Fubm90IGRlcGVuZCBvbiBmaW5kaW5nIHRoZSBpbnN0YWxsIGFjdGlvbgotICAgICAqIGZvciBhIHJlcXVpcmVkIGZhY2V0IGFzIHRoYXQgZmFjZXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gdHlwZSB0aGUgYWN0aW9uIHR5cGUKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBhY3Rpb24gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovPC9zcGFuPgotICAgIAotICAgIEFjdGlvbiBnZXRBY3Rpb24oIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxici8+PGJyLz48YnIvPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTAuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1NDgwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MTUwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPldoYXQncyBOZXcgZm9yIDEuNT88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMS41PzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQKLVByb2plY3QgRnJhbWV3b3JrIGZvciBXVFAgMS41IHJlbGVhc2UuIEJvdGggSmF2YSBBUEkgYW5kIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIAotYXJlIGNvdmVyZWQuIE5vdGUgdGhhdCB0aGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBBUEkgcmVtYWlucyBwcm92aXNpb25hbAotZm9yIHRoZSAxLjUgcmVsZWFzZS4gVGhpcyBtZWFucyBpdCB3aWxsIGNvbnRpbnVlIHVuZGVyZ29pbmcgZnVydGhlciBzaWduaWZpY2FudAotY2hhbmdlcyBpbiBmdXR1cmUgcmVsZWFzZShzKS48L3A+Ci0KLTxwPjxiPkF0dGVudGlvbjo8L2I+IEFsbCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBkZXByZWNhdGVkIAotaW4gdGhlIDEuNSByZWxlYXNlIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgMi4wIHJlbGVhc2UuIFVudGlsIHRoYXQgcG9pbnQgdGhleSAKLXdpbGwgY29udGludWUgdG8gZnVuY3Rpb24gYW5kIGJlIGZ1bGx5IHN1cHBvcnRlZC48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiN2ZXhwcnMiPlZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNhY3Rpb25zIj5BY3Rpb24gRGVmaW5pdGlvbnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiN3aXphcmQiPldpemFyZCBQYWdlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2V2ZW50LmhhbmRsZXJzIj5FdmVudCBIYW5kbGVyczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3J1bnRpbWVzIj5UYXJnZXRpbmcgTXVsdGlwbGUgUnVudGltZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwcmVzZXRzIj5EZXNjcmlwdGlvbnMgZm9yIFByZXNldHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNtaXNjIj5NaXNjZWxsYW5lb3VzPC9hPjwvbGk+Ci08L29sPgotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InZleHBycyI+MS4gVmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VmVyc2lvbiBleHByZXNzaW9ucyBhcmUgdXNlZCBpbiB2YXJpb3VzIGNvbnRleHQgdGhyb3VnaG91dCB0aGUgZnJhbWV3b3JrJ3MKLWV4dGVuc2lvbiBwb2ludHMgYW5kIEphdmEgQVBJIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgbmVlZCB0byBiZSBzcGVjaWZpZWQuIEluCi10aGUgMS4wLnggcmVsZWFzZSwgdGhlIHZlc2lvbiBleHByZXNzaW9ucyB3ZXJlIG9mIHRoZSBmb3JtICImbHQ7MS41LDIuMywyLjUsJmd0PTUuMCIsCi13aGVyZSBjb21tYXMgaW5kaWNhdGUgYSBkaXNqdW5jdGlvbiAob3IpLiBUaGlzIHN5bnRheCBkaWQgbm90IGFsbG93IHJhbmdlcyB0byBiZQotc3BlY2lmaWVkIGFuZCB3YXMgdW53aWVsZHkgZHVlIHRvIHRoZSBuZWVkIHRvIGVzY2FwZSB0aGUgYW5nbGUgYnJhY2tldHMgaW4gdGhlCi1wbHVnaW4ueG1sIGZpbGVzLiBTbyB0aGlzIHN5bnRheCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHRoZSAxLjUgcmVsZWFzZS4gVGhlIG5ldwotc3ludGF4IGFsc28gdXNlcyBjb21tYXMgdG8gc3BlY2lmeSBhIGRpc2p1bmN0aW9uLCBidXQgbm93IHJhbmdlcyBjYW4gYmUKLXNwZWNpZmllZCB1c2luZyAiWzEuMy02LjMpIiBub3RhdGlvbi4gU3F1YXJlIGJyYWNrZXRzIG1lYW4gaW5jbHVzaXZlLCB3aGlsZQotcGFyZW50aGVzaXMgbWVhbiBleGNsdXNpdmUuIE9wZW4gcmFuZ2VzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyBub3RhdGlvbgotbGlrZSAiWzEuMyIgYW5kICI2LjMpIi48L3A+Ci0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iYWN0aW9ucyI+Mi4gQWN0aW9uIERlZmluaXRpb25zPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BY3Rpb24gZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1hZGUgaW50byBmaXJzdCBjbGFzcyBlbnRpdGllcyB3aXRoIHRoZSBuZXcKLWFiaWxpdHkgdG8gYmUgYXNzaWduZWQgYW4gaWQgYW5kIHRoZSBjcmVhdGlvbiBvZiB0aGUgYnJvd3NpbmcgQVBJLiBJbiBhZGRpdGlvbiwKLWl0IGlzIG5vdyBwb3NzaWJsZSB0byBjcmVhdGUgY29uc3RyYWluZWQgVkVSU0lPTl9DSEFOR0UgYWN0aW9ucyBpbiBvcmRlciB0bwotZGVzaWduYXRlIHByZWNpc2VseSB3aGljaCB2ZXJzaW9ucyB0aGUgZGVsZWdhdGUgaXMgY2FwYWJsZSBvZiBjaGFuZ2luZyBmcm9tLgotTXVsdGlwbGUgVkVSU0lPTl9DSEFOR0UgZGVsZWdhdGVzIHdpdGggZGlmZmVyZW50ICJmcm9tLnZlcnNpb25zIiBjb25zdHJhaW50Ci1jYW4gYmUgc3BlY2lmaWVkLjwvcD4KLQotPHA+PHU+RXh0ZW5zaW9uIFBvaW50IENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gIC4uLgotICAmbHQ7YWN0aW9uPC9mb250PiBpZD0ic3RyaW5nIiA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uICZndDsKLSAgICAuLi4KLSAgICA8L2ZvbnQ+Ci0gICAgJmx0O3Byb3BlcnR5IG5hbWU9ImZyb20udmVyc2lvbnMiIHZhbHVlPSJzdHJpbmciLyZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPgotICAgIC4uLgotICAmbHQvYWN0aW9uJmd0OwotICAuLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uCi17Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJPTV9WRVJTSU9OUzsKLSAgIFN0cmluZyBnZXRJZCgpOwotICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgIElWZXJzaW9uRXhwciBnZXRWZXJzaW9uRXhwcigpOwotICAgQWN0aW9uLlR5cGUgZ2V0QWN0aW9uVHlwZSgpOwotICAgTWFwIGdldFByb3BlcnRpZXMoKTsKLSAgIE9iamVjdCBnZXRQcm9wZXJ0eSggU3RyaW5nIG5hbWUgKTsKLSAgIE9iamVjdCBjcmVhdGVDb25maWdPYmplY3QoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBTdHJpbmcgcGpuYW1lICk7Ci19Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbgotewotICAgLi4uPC9mb250PgotICAgYm9vbGVhbiBzdXBwb3J0cyggU2V0IGJhc2UsIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgIFNldCBnZXRBY3Rpb25EZWZpbml0aW9ucygpOwotICAgU2V0IGdldEFjdGlvbkRlZmluaXRpb25zKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBTZXQgYmFzZSwgQWN0aW9uLlR5cGUgdHlwZSApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyCi17Ci0gICAgLi4uPC9mb250PgotICAgIFNldCBnZXRBY3Rpb25EZWZpbml0aW9ucygpOwotICAgIGJvb2xlYW4gaXNBY3Rpb25EZWZpbmVkKCBTdHJpbmcgaWQgKTsKLSAgICBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBTdHJpbmcgaWQgKTsKLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSNGRkYxQzE+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBib29sZWFuIHN1cHBvcnRzKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICBPYmplY3QgY3JlYXRlQWN0aW9uQ29uZmlnKCBBY3Rpb24uVHlwZSB0eXBlLCBTdHJpbmcgcGpuYW1lICk7Ci0gICBib29sZWFuIGlzU2FtZUFjdGlvbkNvbmZpZyggQWN0aW9uLlR5cGUgdHlwZSwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0id2l6YXJkIj4zLiBXaXphcmQgUGFnZXM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSBleHRlbnNpb24gcG9pbnQgc2NoZW1hIGZvciBkZWZpbmluZyB3aXphcmQgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotcHJvamVjdCBmYWNldCBhY3Rpb25zIGhhcyBiZWVuIHJldmlzZWQgdG8gYmUgbW9yZSBmbGV4aWJsZS48L3A+Ci0KLTxwPjx1PkRlcHJlY2F0ZWQgRXh0ZW5zaW9uIFBvaW50PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9I0ZGRjFDMT4KLTxwcmU+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkIiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBmYWNldD0iLi4uIiZndDsKLSAgICAmbHQ7aW5zdGFsbCZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgICAmbHQ7cGFnZSBjbGFzcz0iLi4uIi8mZ3Q7IDxpPigxIG9yIG1vcmUpPC9pPgotICAgICZsdDsvaW5zdGFsbCZndDsKLSAgICAmbHQ7dW5pbnN0YWxsJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgICAgICZsdDtwYWdlIGNsYXNzPSIuLi4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICAgJmx0Oy91bmluc3RhbGwmZ3Q7Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5SZXBsYWNlbWVudCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotJmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBhY3Rpb249Ii4uLiImZ3Q7IDxpPigxIG9yIG1vcmUpPC9pPgotICAgICZsdDtwYWdlIGNsYXNzPSIuLi4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5Ob3RlIHRoZSBuZXcgZXh0ZW5zaW9uIHBvaW50IGlkLiBUaGUgImFjdGlvbiIgYXR0cmlidXRlIHNob3VsZCBjb250YWluIHRoZQotYWN0aW9uIHRoYXQgdGhlc2UgcGFnZXMgYXJlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC4gVGhlIGFjdGlvbiBpZCBjYW4KLWJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZpYSB0aGUgbmV3ICJpZCIgYXR0cmlidXRlIGF2YWlsYWJsZSBvbiB0aGUgImFjdGlvbiIKLWVsZW1lbnQgb2YgdGhlIGNvcmUgZmFjZXRzIGV4dGVuc2lvbiBwb2ludC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaWQKLWlzIGdlbmVyYXRlZCB1c2luZyB0aGUgIltmYWNldC1pZF0jW3ZlcnNpb24tZXhwcmVzc2lvbl0jW2FjdGlvbi10eXBlXSIgCi1wYXR0ZXJuLjwvcD4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRkZGMUMxIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLlByb2plY3RGYWNldHNVaU1hbmFnZXIKLXsKLSAgIC4uLjwvZm9udD4KLSAgIExpc3QgZ2V0V2l6YXJkUGFnZXMoIEFjdGlvbi5UeXBlIHR5cGUsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+UmVwbGFjZW1lbnQgSmF2YSBBUEk8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5Qcm9qZWN0RmFjZXRzVWlNYW5hZ2VyCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBMaXN0IGdldFdpemFyZFBhZ2VzKCBTdHJpbmcgYWN0aW9uSWQgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iZXZlbnQuaGFuZGxlcnMiPjQuIEV2ZW50IEhhbmRsZXJzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BIG5ldyBldmVudCBoYW5kbGluZyBmYWNpbGl0eSBoYXMgYmVlbiBhZGRlZC4gVGhpcyBtYWtlcyBmb3IgYSBjbGVhciBzZXBhcmF0aW9uCi1iZXR3ZWVuIGFjdGlvbnMgKHVzZXIgaW5pdGlhdGVkKSwgYW5kIGV2ZW50cyAoYXV0b21hdGljKS4gUHJpb3IgdG8gdGhpcyBjaGFuZ2UKLWl0IHdhcyBwb3NzaWJsZSB0byByZWdpc3RlciBhICJydW50aW1lLWNoYW5nZWQiIGFjdGlvbi4gVGhhdCB1c2FnZSBpcyBub3cKLWRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdXNlIGV2ZW50IGhhbmRsZXIgZXh0ZW5zaW9uIHBvaW50LiBWYXJpb3VzCi1uZXcgZXZlbnRzIGhhdmUgYWxzbyBiZWVuIGFkZGVkLjwvcD4KLQotPHA+PHU+RXZlbnQgVHlwZXM8L3U+PC9wPgotCi08cD5QUkVfSU5TVEFMTCwgUE9TVF9JTlNUQUxMLCBQUkVfVU5JTlNUQUxMLCBQT1NUX1VOSU5TVEFMTCwgUFJFX1ZFUlNJT05fQ0hBTkdFLAotUE9TVF9WRVJTSU9OX0NIQU5HRSwgUlVOVElNRV9DSEFOR0VEPC9wPgotCi08cD48dT5FeHRlbnNpb24gUG9pbnQgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgLi4uPC9mb250PgotICAmbHQ7ZXZlbnQtaGFuZGxlciB0eXBlPSIuLi4iIGZhY2V0PSIuLi4iIHZlcnNpb249Ii4uLiImZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlIGNsYXNzPSIuLi4iLyZndDsKLSAgJmx0L2V2ZW50LWhhbmRsZXImZ3Q7Ci0gIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+UlVOVElNRV9DSEFOR0VEIEV2ZW50PC91PjwvcD4KLQotPHA+SW4gdGhlIDEuMC54IHJlbGVhc2UgaXQgd2FzIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIGEgInJ1bnRpbWUtY2hhbmdlZCIgYWN0aW9uLgotVGhhdCB1c2FnZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgUlVOVElNRV9DSEFOR0VECi1ldmVudCBoYW5kbGVyLiBUaGUgUlVOVElNRV9DSEFOR0VEIGV2ZW50IGhhbmRsZXIgZGVsZWdhdGUgZ2V0cyBwYXNzZWQgaW4gYQotY29uZmlnIG9iamVjdCB0aGF0IGNhcnJpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQuPC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLXsKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgSVJ1bnRpbWUgZ2V0TmV3UnVudGltZSgpOwotfSAgCi08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0icnVudGltZXMiPjUuIFRhcmdldGluZyBNdWx0aXBsZSBSdW50aW1lczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIGFiaWxpdHkgZm9yIGEgcHJvamVjdCB0byB0YXJnZXQgbXVsdGlwbGUgcnVudGltZXMgaGFzIGJlZW4gZnVydGhlcgotZmxlc2hlZCBvdXQgZHVyaW5nIHRoZSAxLjUgcmVsZWFzZS48L3A+Ci0gICAKLTxwPjx1PkRlcHJlY2F0ZWQgSmF2YSBBUEk8L3U+PC9wPgotICAgCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotewotICAgLi4uPC9mb250PgotICAgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotICAgdm9pZCBzZXRSdW50aW1lKCBJUnVudGltZSBydW50aW1lICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLSAgICAgCi08cD48dT5SZXBsYWNlbWVudCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17Ci0gICAuLi48L2ZvbnQ+Ci0gICBTZXQgZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotICAgdm9pZCBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBTZXQgcnVudGltZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgdm9pZCBhZGRUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgdm9pZCByZW1vdmVUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgSVJ1bnRpbWUgZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgIHZvaWQgc2V0UHJpbWFyeVJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJwcmVzZXRzIj42LiBEZXNjcmlwdGlvbnMgZm9yIFByZXNldHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkl0IGlzIG5vdyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgZGVzY3JpcHRpb24gd2l0aCBwcmVzZXRzLjwvcD4KLSAgIAotPHA+PHU+RXh0ZW5zaW9uIFBvaW50cyBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAuLi4KLSAgJmx0O3ByZXNldCZndDsKLSAgICAuLi48L2ZvbnQ+Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Oy4uLiZsdC9kZXNjcmlwdGlvbiZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotICAmbHQvcHJlc2V0Jmd0OwotICAuLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXIKLXsKLSAgIC4uLjwvZm9udD4KLSAgIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXQgZmFjZXRzICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldAotewotICAgLi4uPC9mb250PgotICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Im1pc2MiPjcuIE1pc2NlbGxhbmVvdXM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPjx1PkphdmEgQVBJIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBib29sZWFuIGlzVmFsaWRGb3IoIFNldCBmaXhlZCApOwotICAgYm9vbGVhbiBjb25mbGljdHNXaXRoKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHIKLXsKLSAgIGJvb2xlYW4gZXZhbHVhdGUoIFN0cmluZyB2ZXJzaW9uICk7Ci0gICBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCk7Ci19Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTEuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkM2Q4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MTUxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+V2hhdCdzIE5ldyBmb3IgMS41LjE/PC90aXRsZT4KLTxsaW5rCi0gIHJlbD0ic3R5bGVzaGVldCIKLSAgdHlwZT0idGV4dC9jc3MiCi0gIGhyZWY9ImZvcm1hdC5jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxwIGNsYXNzPSJ1ZWJlcnNjaHJpZnQiPldoYXQncyBOZXcgZm9yIDEuNS4xPzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQKLVByb2plY3QgRnJhbWV3b3JrIGZvciBXVFAgMS41LjEgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IAotY2hhbmdlcyBhcmUgY292ZXJlZC4gTm90ZSB0aGF0IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEFQSSByZW1haW5zIAotcHJvdmlzaW9uYWwgZm9yIHRoZSAxLjUuMSByZWxlYXNlLiBUaGlzIG1lYW5zIGl0IHdpbGwgY29udGludWUgdW5kZXJnb2luZyAKLWZ1cnRoZXIgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiBmdXR1cmUgcmVsZWFzZShzKS48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNkZWZ2ZXIiPlNwZWNpZnlpbmcgRGVmYXVsdCBGYWNldCBWZXJzaW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjd2lsZGNhcmQiPldpbGRjYXJkIFN1cHBvcnQgaW4gVmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2xpPgotPC9vbD4KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ2ZXhwcnMiPjEuIFNwZWNpZnlpbmcgRGVmYXVsdCBGYWNldCBWZXJzaW9uPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5JdCBpcyBub3cgcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0Ci13aGVuIHRoZSBmYWNldCBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0Ci12ZXJzaW9uLiBZb3UgY2FuIGVpdGhlciBzcGVjaWZ5IGEgc3RhdGljIGRlZmF1bHQgb3IgeW91IGNhbiBpbXBsZW1lbnQgdGhlCi08Y29kZT5JRGVmYXVsdFZlcnNpb25Qcm92aWRlcjwvY29kZT4gaW50ZXJmYWNlLiBJZiBhIGRlZmF1bHQgdmVyc2lvbiBpcyBub3QKLXNwZWNpZmllZCwgdGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLjwvcD4KLQotPHA+PHU+RXh0ZW5zaW9uIFBvaW50IENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0Jmd0OzwvZm9udD4KLSAgICAmbHQ7ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IntzdHJpbmd9Ii8mZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2RlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ie2NsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyfSIvJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQKLXs8L2ZvbnQ+Ci0gICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi17Ci0gICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpOwotfQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ3aWxkY2FyZCI+Mi4gV2lsZGNhcmQgU3VwcG9ydCBpbiBWZXJzaW9uIEV4cHJlc3Npb25zPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BIHdpbGRjYXJkIGNoYXJhY3RlciAnKicgY2FuIG5vdyBiZSB1c2VkIGluIHZlcnNpb24gZXhwcmVzc2lvbnMgaW4gb3JkZXIgdG8KLW1hdGNoIGFueSB2ZXJzaW9uLiBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgd2lsZGNhcmQgdG8gbWF0Y2gKLXBhcnQgb2YgdGhlIHZlcnNpb24gc3RyaW5nLjwvcD4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHIKLXs8L2ZvbnQ+Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTERDQVJEX1NZTUJPTCA9ICIqIjsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MjAuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcyMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Y1ZjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcyMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YQotICBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi0gIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5XaGF0J3MgTmV3IGZvciAyLjA/PC90aXRsZT4KLTxsaW5rCi0gIHJlbD0ic3R5bGVzaGVldCIKLSAgdHlwZT0idGV4dC9jc3MiCi0gIGhyZWY9ImZvcm1hdC5jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxwIGNsYXNzPSJ1ZWJlcnNjaHJpZnQiPldoYXQncyBOZXcgZm9yIDIuMD88L3A+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBBUEkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGZvciAKLXRoZSBXVFAgMi4wIHJlbGVhc2UuIEJvdGggSmF2YSBBUEkgYW5kIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIGFyZSBjb3ZlcmVkLiBBbGwgQVBJIHRoYXQgd2FzIAotZGVwcmVjYXRlZCBpbiB0aGlzIHJlbGVhc2UgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgY2xpZW50cyBhcmUgYWR2aXNlZCB0byBzd2l0Y2ggdG8gbm9uLWRlcHJlY2F0ZWQgCi1hbHRlcm5hdGl2ZXMgYXMgc29vbiBhcyBmZWFzaWJsZS48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNnZW5lcmljcyI+R2VuZXJpY3M8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwcmVzZXRzIj5JbXByb3ZlbWVudHMgdG8gUHJlc2V0czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2NvbXBhcmFibGUiPklQcm9qZWN0RmFjZXRWZXJzaW9uIGFuZCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gRXh0ZW5kIENvbXBhcmFibGU8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNyZXF1aXJlcy1ncm91cCI+UmVxdWlyZXMgQ29uc3RyYWludCBTdXBwb3J0cyBHcm91cHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNncm91cC1sYWJlbHMiPkxhYmVscyBhbmQgRGVzY3JpcHRpb25zIGZvciBHcm91cHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiN2YWxpZGF0ZSI+TmV3IElGYWNldGVkUHJvamVjdCBWYWxpZGF0aW9uIEFQSTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI25ldy13aXphcmQtY2xhc3MiPkFkZFJlbW92ZUZhY2V0c1dpemFyZCBDbGFzcyBSZW5hbWVkIHRvIE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcGRlLWxpbWl0YXRpb25zIj5FeHRlbnNpb24gUG9pbnQgU2NoZW1hIENoYW5nZXMgdG8gV29yayBBcm91bmQgUERFIExpbWl0YXRpb25zPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjbGlzdGVuZXJzIj5MaXN0ZW5lcnMgYW5kIEV2ZW50czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI21pc2MiPk1pc2NlbGxhbmVvdXM8L2E+PC9saT4KLTwvb2w+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjZ2VuZXJpY3MiPjEuIEdlbmVyaWNzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BbGwgb2YgdGhlIGZyYW1ld29yaydzIEFQSSBub3cgdXNlIEphdmEgNSBnZW5lcmljcy4gVGhpcyBoYXMgYmVlbiBkb25lIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUKLXdheSBhbmQgZXhpc3RpbmcgY2xpZW50cyBhcmUgZXhwZWN0ZWQgdG8gY29udGludWUgdG8gd29yayB3aXRob3V0IGFueSBtb2RpZmljYXRpb25zLiBJbiBvcmRlciBmb3IgYSAKLWNsaWVudCB0byBnYWluIGFjY2VzcyB0byB0aGUgdHlwZSBzYWZldHkgYWZmb3JkZWQgYnkgZ2VuZXJpY3MgaW4gdGhpcyBBUEksIHRoZSBjbGllbnQgcGx1Z2luJ3MgSmF2YSAKLWNvbXBpbGVyIGxldmVsIHNob3VsZCBiZSBjb25maWd1cmVkIHRvIGJlIDUuMCBvciBuZXdlci48L3A+ICAKLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InByZXNldHMiPjIuIEltcHJvdmVtZW50cyB0byBQcmVzZXRzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5TaWduaWZpY2FudCBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIHByZXNldHMgZmFjaWxpdHkgZm9yIHRoZSAyLjAgcmVsZWFzZS4gQSBuZXcgdHlwZSBvZgotcHJlc2V0LCByZWZlcnJlZCB0byBhcyBhIGR5bmFtaWMgcHJlc2V0LCBpcyBub3cgYXZhaWxhYmxlLiBBIGR5bmFtaWMgcHJlc2V0IHVzZXMgYW4gZXh0ZW5kZXItc3VwcGxpZWQKLWZhY3RvcnkgdG8gc3ludGhlc2l6ZSB0aGUgcHJlc2V0IGRlZmluaXRpb24gb24gdGhlIGZseSBiYXNlZCBvbiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCB3aWxsIGJlCi11c2VkLiBUaGUgIm9sZC1zdHlsZSIgZGVjbGFyYXRpdmUgcHJlc2V0cyBhcmUgc3RpbGwgYXZhaWxhYmxlIGFuZCBhcmUgbm93IHJlZmVycmVkIHRvIGFzIHN0YXRpYwotcHJlc2V0cy4gU3RhdGljIHByZXNldHMgaGF2ZSBhbHNvIGJlZW4gaW1wcm92ZWQgdG8gYWxsb3cgdGhlbSB0byBleHRlbmQgb3RoZXIgcHJlc2V0cy4gQSBzdGF0aWMKLXByZXNldCBjYW4gZXZlbiBleHRlbmQgYSBkeW5hbWljIHByZXNldC48L3A+Ci0KLTxwPlRoZXJlIGlzIGFsc28gYSBuZXcgcHJlc2V0IHRoYXQncyBwYXJ0IG9mIHRoZSBmcmFtZXdvcmsuIEl0J3MgYSBkeW5hbWljIHByZXNldCB3aXRoIGlkIG9mIAotImRlZmF1bHQuY29uZmlndXJhdGlvbiIgYW5kIHdob3NlIGNvbnRlbnRzIGFyZSBzeW50aGVzaXplZCBhcyBmb2xsb3dzOjwvcD4KLQotPG9sPgotICA8bGk+SWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCBmYWNldHMgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgSVJ1bnRpbWUuZ2V0RGVmYXVsdEZhY2V0cyhTZXQpLjwvbGk+Ci0gIDxsaT5JZiBubyBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCB2ZXJzaW9ucyBmb3IgYWxsIG9mIHRoZSBmaXhlZAotICAgIGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkgSVByb2plY3RGYWNldC5nZXREZWZhdWx0VmVyc2lvbigpLjwvbGk+Ci08L29sPiAgIAotCi08cD48dT5OZXcgRXh0ZW5zaW9uIFBvaW50PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLSZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiJmd0OwotICAmbHQ7c3RhdGljLXByZXNldCBpZD0iPGk+e3N0cmluZ308L2k+IiBleHRlbmRzPSI8aT57c3RyaW5nfTwvaT4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2xhYmVsJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtmYWNldCBpZD0iPGk+e3N0cmluZ308L2k+IiB2ZXJzaW9uPSI8aT57c3RyaW5nfTwvaT4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsgPGk+KDAgb3IgbW9yZSk8L2k+Ci0gICZsdDtkeW5hbWljLXByZXNldCBpZD0iPGk+e3N0cmluZ308L2k+IiZndDsKLSAgICAmbHQ7ZmFjdG9yeSBjbGFzcz0iPGk+e2NsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXRGYWN0b3J5fTwvaT4iLyZndDsKLSAgJmx0Oy9keW5hbWljLXByZXNldCZndDsgPGk+KDAgb3IgbW9yZSk8L2k+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7cHJlc2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2xhYmVsJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtmYWNldCBpZD0iPGk+e3N0cmluZ308L2k+IiB2ZXJzaW9uPSI8aT57c3RyaW5nfTwvaT4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvcHJlc2V0Jmd0OyA8aT4oMCBvciBtb3JlKTwvaT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkphdmEgQVBJIEFkZGl0aW9uczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+aW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQKLXs8L2ZvbnQ+Ci0gICAgZW51bSBUeXBlIHsgU1RBVElDLCBEWU5BTUlDLCBVU0VSX0RFRklORUQgfQotICAgIFR5cGUgZ2V0VHlwZSgpOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLWludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRHluYW1pY1ByZXNldCBleHRlbmRzIElQcmVzZXQKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX0ZJWEVEX0ZBQ0VUUzsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX1BSSU1BUllfUlVOVElNRTsKLSAgICBJUHJlc2V0IHJlc29sdmUoIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICk7Ci19Ci0KLWludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0RmFjdG9yeQotewotICAgIFByZXNldERlZmluaXRpb24gY3JlYXRlUHJlc2V0KCBTdHJpbmcgcHJlc2V0SWQsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICk7Ci19Ci0KLWNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByZXNldERlZmluaXRpb24KLXsKLSAgICBQcmVzZXREZWZpbml0aW9uKCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKTsKLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKTsKLX0KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrCi17PC9mb250PgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OX1BSRVNFVF9JRDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSNGRkYxQzE+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPmludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0Ci17PC9mb250PgotICAgIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCgpCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjY29tcGFyYWJsZSI+My4gSVByb2plY3RGYWNldFZlcnNpb24gYW5kIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBFeHRlbmQgQ29tcGFyYWJsZTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFuZCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gaW50ZXJmYWNlcyBub3cgZXh0ZW5kCi1Db21wYXJhYmxlLiBVc2luZyB0aGUgY29tcGFyZVRvIG1ldGhvZHMgd2lsbCB5aWVsZCBzaWduaWZpY2FudGx5IGJldHRlciBwZXJmb3JtYW5jZQotdGhhbiBjYWxsaW5nIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IgZGlyZWN0bHkgb24gdGhlIHZlcnNpb24gc3RyaW5ncyBhcyB0aGUgCi1jb21wYXJlVG8gbWV0aG9kcyB1c2UgcHJlLWNvbXB1dGVkIHJlc3VsdHMgYW5kIGRvIG5vdCBuZWVkIHRvIHBhcnNlIHRoZSB2ZXJzaW9uCi1zdHJpbmdzLjwvcD4KLQotPHA+QXMgcGFydCBvZiB0aGlzIGNoYW5nZSwgSVZlcnNpb25FeHByLmV2YWx1YXRlKCBTdHJpbmcgKSBtZXRob2QgaGFzIGJlZW4KLXJlcGxhY2VkIHdpdGggSVZlcnNpb25FeHByLmNoZWNrKCBDb21wYXJhYmxlICkgbWV0aG9kLjwvcD4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNyZXF1aXJlcy1ncm91cCI+NC4gUmVxdWlyZXMgQ29uc3RyYWludCBTdXBwb3J0cyBHcm91cHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSByZXF1aXJlcyBjb25zdHJhaW50IGNhbiBub3cgYmUgZGVjbGFyZWQgdXNpbmcgZmFjZXQgZ3JvdXBzIGluc3RlYWQgb2YKLWluZGl2aWR1YWwgZmFjZXRzLiBBbnkgbWVtYmVyIG9mIHRoZSBncm91cCB3aWxsIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQuIFRoaXMKLWFsbG93cyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIHNvIHRoYXQgYSBmYWNldCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIG9mCi10aGUgZ3JvdXAgbWVtYmVycy48L3A+Ci0KLTxwPjx1PkV4dGVuc2lvbiBQb2ludCBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotICAgICZsdDtjb25zdHJhaW50Jmd0OzwvZm9udD4KLSAgICAgICZsdDtyZXF1aXJlcyBncm91cD0iZ3JvdXAuaWQiLyZndDsKLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0Oy9jb25zdHJhaW50Jmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Imdyb3VwLWxhYmVscyI+NS4gTGFiZWxzIGFuZCBEZXNjcmlwdGlvbnMgZm9yIEdyb3VwczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SXQgaXMgbm93IHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBsYWJlbHMgYW5kIGRlc2NyaXB0aW9uIHdpdGggZ3JvdXBzLiBOb3RlIHRoYXQKLWdyb3VwcyBhcmUgc3RpbGwgYXV0b21hdGljYWxseSBjcmVhdGVkIG9uIGZpcnN0IHVzZSwgc28gdGhlIHVzZSBvZiB0aGUgbmV3IGdyb3VwCi1lbGVtZW50IGlzIG9ubHkgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHNwZWNpZnkgdGhlIGxhYmVsIGFuZCB0aGUgZGVzY3JpcHRpb24uPC9wPgotICAgCi08cD48dT5FeHRlbnNpb24gUG9pbnRzIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7Z3JvdXAgaWQ9Ii4uLiImZ3Q7IDxpPigwIG9yIG1vcmUpPC9pPgotICAgICZsdDtsYWJlbCZndDsuLi4mbHQvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Oy4uLiZsdC9kZXNjcmlwdGlvbiZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICZsdC9ncm91cCZndDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkphdmEgQVBJIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cAotezwvZm9udD4KLSAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ2YWxpZGF0ZSI+Ni4gTmV3IElGYWNldGVkUHJvamVjdCBWYWxpZGF0aW9uIEFQSTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlcmUgaXMgbm93IEFQSSBmb3IgdmFsaWRhdGluZyB0aGUgZmFjZXRlZCBwcm9qZWN0LiBJdCBhbGxvd3MgdGhlIGNhbGxlciB0bwotZmluZCBvdXQgYWJvdXQgYW55IHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgd2l0aG91dCBzZWFyY2hpbmcgZm9yIHByb2JsZW0KLW1hcmtlcnMgY3JlYXRlZCBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IHZhbGlkYXRpb24gYnVpbGRlci4gVGhlIHZhbGlkYXRpb24KLWJ1aWxkZXIgbm93IHVzZXMgdGhlIG5ldyBBUEkuPC9wPgotCi08cD48dT5KYXZhIEFQSSBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXs8L2ZvbnQ+Ci0gICBJU3RhdHVzIHZhbGlkYXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Im5ldy13aXphcmQtY2xhc3MiPjcuIEFkZFJlbW92ZUZhY2V0c1dpemFyZCBDbGFzcyBSZW5hbWVkIHRvIE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgQWRkUmVtb3ZlRmFjZXRzV2l6YXJkIGNsYXNzIGhhcyBiZWVuIHJlbmFtZWQgdG8gTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQKLXRvIGFsaWduIHdpdGggdGVybWlub2xvZ3kgY2hhbmdlIGJlaW5nIG1hZGUgaW4gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gVGhlIG9sZAotY2xhc3MgaXMgZGVwcmVjYXRlZCwgYnV0IHN0aWxsIHN1cHBvcnRlZCAoZXh0ZW5kcyB0aGUgbmV3IGNsYXNzKS48L3A+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJwZGUtbGltaXRhdGlvbnMiPjguIEV4dGVuc2lvbiBQb2ludCBTY2hlbWEgQ2hhbmdlcyB0byBXb3JrIEFyb3VuZCBQREUgTGltaXRhdGlvbnM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIGZhbHNlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFBERSdzIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgdmFsaWRhdGlvbiwgdGhlCi1mb2xsb3dpbmcgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cy4gVGhlIG9sZCBzeW50YXggaXMgZGVwcmVjYXRlZCwKLWJ1dCBpcyBzdGlsbCBzdXBwb3J0ZWQuPC9wPgotCi08cD5XaGVuIGRlY2xhcmluZyB0aGF0IGEgZmFjZXQgYmVsb25ncyB0byBhIGNhdGVnb3J5Li4uPC9wPgotCi08cD48dT5PbGQgU3ludGF4PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L2ZvbnQ+Ci0gICAgJmx0O2NhdGVnb3J5Jmd0Oy4uLiZsdC9jYXRlZ29yeSZndDsKLSAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdC9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5OZXcgU3ludGF4PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L2ZvbnQ+Ci0gICAgJmx0O21lbWJlciBjYXRlZ29yeT0iLi4uIi8mZ3Q7Ci0gIDxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQvcHJvamVjdC1mYWNldCZndDsKLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Imxpc3RlbmVycyI+OS4gTGlzdGVuZXJzIGFuZCBFdmVudHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSBleGlzdGluZyBmYWNpbGl0aWVzIGZvciBsaXN0ZW5pbmcgb24gZmFjZXRlZCBwcm9qZWN0IG1vZGVsIGNoYW5nZXMgaGF2ZSBiZWVuIHJlLWRlc2lnbmVkIHRvCi1wcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZSB0aGF0IHRvb2sgcGxhY2UgYW5kIHRvIHByb3ZpZGUgdGhlIHNhbWUgZmFjaWxpdHkKLXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY2xpZW50IGNob29zZXMgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVyIHZpYSBkaXJlY3QgQVBJIGNhbGwgb3IgdmlhIGFuCi1leHRlbnNpb24gcG9pbnQuPC9wPgotCi08cD5JbiAxLjUsIGV4dGVuZGVycyBjb3VsZCBlaXRoZXI6PC9wPgotCi08b2w+Ci0gIAotICA8bGk+VXNlIDxjb2RlPklGYWNldGVkUHJvamVjdC5hZGRMaXN0ZW5lcigpPC9jb2RlPiBtZXRob2QuIExpc3RlbmVyIHdvdWxkIGdldCBjYWxsZWQgd2hlbiBhbnkKLSAgYXNwZWN0IG9mIGZhY2V0ZWQgcHJvamVjdCBtb2RlbCB3YXMgY2hhbmdlZCwgYnV0IHRoZSBsaXN0ZW5lciB3YXMgbm90IGdpdmVuIGFueSBkZXRhaWxzIGFib3V0Ci0gIHRoZSBjaGFuZ2UgdGhhdCB0b29rIHBsYWNlLjxici8+PGJyLz48L2xpPgotICAKLSAgPGxpPlVzZSA8Y29kZT4mbHQ7ZXZlbnQtaGFuZGxlciZndDs8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIAotICA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBhbgotICA8Y29kZT5JRGVsZWdhdGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHNpbWlsYXIgdG8gaG93IGFjdGlvbnMgYXJlIGltcGxlbWVudGVkLiBUaGlzIAotICBhcHByb2FjaCBnYXZlIHVzZXIgYSBiaXQgbW9yZSBjb250cm9sIG92ZXIgd2hhdCBldmVudHMgdG8gcHJvY2VzcyBhcyB3ZWxsIGFzIG1vcmUgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIHdoYXQgYWN0dWFsbHkgdG9vayBwbGFjZS4gSG93ZXZlciwgbm90IGFsbCBjaGFuZ2VzIGNvdWxkIGJlIHN1cmZhY2VkIHZpYSB0aGlzIAotICBpbnRlcmZhY2UgZHVlIHRvIGxpbWl0YXRpb25zIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgYW5kIHRoZSA8Y29kZT5JRGVsZWdhdGU8L2NvZGU+IGludGVyZmFjZS48L2xpPgotICAKLTwvb2w+Ci0KLTxwPkZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGUgbmV3IGZhY2lsaXR5IGNhbiBiZSBmb3VuZCA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCI+aGVyZTwvYT4uPC9wPgotICAgCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyCi17Ci0gICAgdm9pZCBoYW5kbGVFdmVudCggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgZW51bSBUeXBlCi0gICAgewotICAgICAgICBQUk9KRUNUX01PRElGSUVELAotICAgICAgICBQUkVfSU5TVEFMTCwKLSAgICAgICAgUE9TVF9JTlNUQUxMLAotICAgICAgICBQUkVfVU5JTlNUQUxMLAotICAgICAgICBQT1NUX1VOSU5TVEFMTCwKLSAgICAgICAgUFJFX1ZFUlNJT05fQ0hBTkdFLAotICAgICAgICBQT1NUX1ZFUlNJT05fQ0hBTkdFLAotICAgICAgICBGSVhFRF9GQUNFVFNfQ0hBTkdFRCwKLSAgICAgICAgVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQKLSAgICB9Ci0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0gICAgSUZhY2V0ZWRQcm9qZWN0IGdldFByb2plY3QoKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGaXhlZEZhY2V0c0NoYW5nZWRFdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgU2V0Jmx0O0lQcm9qZWN0RmFjZXQmZ3Q7IGdldE9sZEZpeGVkRmFjZXRzKCk7Ci0gICAgU2V0Jmx0O0lQcm9qZWN0RmFjZXQmZ3Q7IGdldE5ld0ZpeGVkRmFjZXRzKCk7Ci19Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgOiBJRmFjZXRlZFByb2plY3RFdmVudAotewotICAgIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgIE9iamVjdCBnZXRBY3Rpb25Db25maWcoKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgSVJ1bnRpbWUgZ2V0T2xkUHJpbWFyeVJ1bnRpbWUoKTsKLSAgICBJUnVudGltZSBnZXROZXdQcmltYXJ5UnVudGltZSgpOwotfQotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQgOiBJRmFjZXRlZFByb2plY3RFdmVudAotewotICAgIFNldCZsdDtJUnVudGltZSZndDsgZ2V0T2xkVGFyZ2V0ZWRSdW50aW1lcygpOwotICAgIFNldCZsdDtJUnVudGltZSZndDsgZ2V0TmV3VGFyZ2V0ZWRSdW50aW1lcygpOwotfQotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17PC9mb250PgotICAgIHZvaWQgYWRkTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiApOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yawotezwvZm9udD4KLSAgICB2b2lkIGFkZExpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gKTsKLSAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+TmV3IEV4dGVuc2lvbiBQb2ludDwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMiJmd0OwotICAmbHQ7bGlzdGVuZXIgCi0gICAgY2xhc3M9IntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9IgotICAgIGV2ZW50VHlwZXM9Intjc3Y6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50LlR5cGV9Ii8+IDxpPigxIG9yIG1vcmUpPC9pPgotJmx0O2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkRlcHJlY2F0ZWQgSmF2YSBBUEk8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0jRkZGMUMxPgotPHByZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyCi17Ci0gICAgcHJvamVjdENoYW5nZWQoKTsKLX0KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotezwvZm9udD4KLSAgICB2b2lkIGFkZExpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciApOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyICk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLXsKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgSVJ1bnRpbWUgZ2V0TmV3UnVudGltZSgpOwotfQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7ZXZlbnQtaGFuZGxlciB0eXBlPSJ7c3RyaW5nfSIgZmFjZXQ9IntzdHJpbmd9IiB2ZXJzaW9uPSJ7c3RyaW5nfSImZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlIGNsYXNzPSJ7Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlfSIvJmd0OwotICAmbHQvZXZlbnQtaGFuZGxlciZndDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJtaXNjIj4xMC4gTWlzY2VsbGFuZW91czwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXs8L2ZvbnQ+Ci0gICAgYm9vbGVhbiBpc1RhcmdldGFibGUoIElSdW50aW1lIHJ1bnRpbWUgKTsKLSAgICBib29sZWFuIGlzVGFyZ2V0ZWQoIElSdW50aW1lIHJ1bnRpbWUgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MzAxLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MzAxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTdjODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzMwMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPldoYXQncyBOZXcgZm9yIDIuMD88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMy4wLjE/PC9wPgotCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQVBJIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBmb3IgCi10aGUgV1RQIDMuMC4xIHJlbGVhc2UuIEJvdGggSmF2YSBBUEkgYW5kIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIGFyZSBjb3ZlcmVkLiBBbGwgQVBJIHRoYXQgd2FzIAotZGVwcmVjYXRlZCBpbiB0aGlzIHJlbGVhc2UgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgY2xpZW50cyBhcmUgYWR2aXNlZCB0byBzd2l0Y2ggdG8gbm9uLWRlcHJlY2F0ZWQgCi1hbHRlcm5hdGl2ZXMgYXMgc29vbiBhcyBmZWFzaWJsZS48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNzZXBhcmF0ZS1pY29ucyI+U2VwYXJhdGUgSWNvbnMgZm9yIERpZmZlcmVudCBWZXJzaW9ucyBvZiBhIFJ1bnRpbWUgQ29tcG9uZW50IFR5cGU8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNyY3YtYWRhcHRhYmxlIj5JUnVudGltZUNvbXBvbmVudFZlcnNpb24gRXh0ZW5kcyBJQWRhcHRhYmxlPC9hPjwvbGk+Ci08L29sPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iI3NlcGFyYXRlLWljb25zIj4xLiBTZXBhcmF0ZSBJY29ucyBmb3IgRGlmZmVyZW50IFZlcnNpb25zIG9mIGEgUnVudGltZSBDb21wb25lbnQgVHlwZTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIDxjb2RlPmltYWdlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IG5vdyBzdXBwb3J0cyBhIDxjb2RlPnZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZSB3aGVuIHVzZWQKLXRvZ2V0aGVyIHdpdGggPGNvZGU+cnVudGltZS1jb21wb25lbnQtdHlwZTwvY29kZT4gYXR0cmlidXRlLiBUaGlzIGFsbG93cyBzZXBhcmF0ZSBpY29ucyB0byBiZSB1c2VkCi1mb3IgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUuPC9wPiAgCi0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjcmN2LWFkYXB0YWJsZSI+Mi4gSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIEV4dGVuZHMgSUFkYXB0YWJsZTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGludGVyZmFjZSBub3cgZXh0ZW5kcyBwbGF0Zm9ybSdzIElBZGFwdGFibGUgaW50ZXJmYWNlLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzMxMC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzMxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU4N2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXczMTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+V2hhdCdzIE5ldyBmb3IgMy4xPzwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSJmb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5XaGF0J3MgTmV3IGZvciAzLjE/PC9wPgotCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQVBJIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBmb3IgCi10aGUgV1RQIDMuMSByZWxlYXNlLiBCb3RoIEphdmEgQVBJIGFuZCBleHRlbnNpb24gcG9pbnQgY2hhbmdlcyBhcmUgY292ZXJlZC48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNmcmFtZXdvcmstZXhjZXB0aW9uIj5GYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2JhdGNoaW5nLXZhbGlkYXRlLWVkaXQiPkJhdGNoaW5nIFZhbGlkYXRlIEVkaXQgQ2FsbHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNiYXNpYy13aXphcmQiPkltcHJvdmVtZW50cyB0byBCYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcHJlZmVyZW5jZXMiPk1hbmFnaW5nIFByb2plY3QgRmFjZXQgUHJlZmVyZW5jZXM8L2E+PC9saT4KLTwvb2w+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjZnJhbWV3b3JrLWV4Y2VwdGlvbiI+MS4gRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb248L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkEgZnJhbWV3b3JrLXNwZWNpZmljIHN1YmNsYXNzIG9mIENvcmVFeGNlcHRpb24gaGFzIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byBhbGxvdyBJRGVsZWdhdGUgaW1wbGVtZW50YXRpb25zIAotYSB3YXkgdG8gc2lnbmFsIHRoYXQgYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkLiBBbiBleGFtcGxlIG9mIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyB3aGVuIGEgdXNlciAKLWRlY2xpbmVzIHRvIG1ha2UgYSBuZWNlc3NhcnkgZmlsZSB3cml0YWJsZS4gTWFya2luZyBhbiBleGNlcHRpb24gYXMgZXhwZWN0ZWQgY2FuIGJlIHVzZWQgYXMgYSBzaWduYWwgCi1ieSBoYW5kbGVycyB0byBhbHRlciB0aGUgd2F5IHRoZSBleGNlcHRpb24gaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChwZXJoYXBzIG5vdCBkaXNwbGF5aW5nIHRoZSAKLXN0YWNrIHRyYWNlIGFuZC9vciBub3QgbG9nZ2luZyBpdCkuPC9wPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotaW50ZXJmYWNlIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uIGV4dGVuZHMgQ29yZUV4Y2VwdGlvbgotewotICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uKCBJU3RhdHVzIHN0YXR1cyApOwotICAgIGJvb2xlYW4gaXNFeHBlY3RlZCgpOwotICAgIHZvaWQgc2V0RXhjcGV0ZWQoIGJvb2xlYW4gZXhwZWN0ZWQgKTsKLX0KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjYmF0Y2hpbmctdmFsaWRhdGUtZWRpdCI+Mi4gQmF0Y2hpbmcgVmFsaWRhdGUgRWRpdCBDYWxsczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGJhdGNoIElXb3Jrc3BhY2UudmFsaWRhdGVFZGl0KCkgY2FsbHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIKLW9mIHByb21wdHMgdG8gdGhlIHVzZXIuIEFuIEFQSSBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdyBhIGZhY2V0IGFjdGlvbiB0byBzcGVjaWZ5IHRoZSBmaWxlcyB0aGF0Ci1pdCBpbnRlbmRzIHRvIG9wZXJhdGUgb24uIFRoZSBmcmFtZXdvcmsgd2lsbCBtYWtlIGEgYmF0Y2hlZCBjYWxsIHRvIHZhbGlkYXRlRWRpdCBwcmlvciB0byBydW5uaW5nIAotYW55IG9mIHRoZSBhY3Rpb25zLjwvcD4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5hYnN0cmFjdCBjbGFzcyBBY3Rpb25Db25maWcKLXs8L2ZvbnQ+ICAgIAotICAgIFNldDxJRmlsZT4gZ2V0VmFsaWRhdGVFZGl0RmlsZXMoKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNiYXNpYy13aXphcmQiPjMuIEltcHJvdmVtZW50cyB0byBCYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgZ2VuZXJpYyBOZXcgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCBub3cgYWxsb3dzIHRoZSBwcm9qZWN0IHRvIGJlIGFkZGVkIHRvIHdvcmtpbmcKLXNldHMgdmlhIFVJIG9uIHRoZSBmaXJzdCBwYWdlLjwvcD4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5jbGFzcyBCYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkCi17PC9mb250PiAgICAKLSAgICBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpOwotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLWNsYXNzIEJhc2ljRmFjZXRlZFByb2plY3RXaXphcmRGaXJzdFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlCi17ICAgIAotfQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLSAKLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjcHJlZmVyZW5jZXMiPjQuIE1hbmFnaW5nIFByb2plY3QgRmFjZXQgUHJlZmVyZW5jZXM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPk5ldyBmYWNpbGl0eSBmb3IgbWFuYWdpbmcgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGZhY2V0cyBoYXMgYmVlbiBpbnRyb2R1Y2VkLiBNb3JlIGluZm9ybWF0aW9uCi1jYW4gYmUgZm91bmQgaW4gPGEgaHJlZj0iYW5zd2Vycy9wcm9qZWN0RmFjZXRQcmVmZXJlbmNlcy5odG1sIj5GQVE8L2E+LjwvcD4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5jbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29yawotezwvZm9udD4KLSAgICBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyggSVByb2plY3RGYWNldCBmYWNldCApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5pbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0Ci17PC9mb250PgotICAgIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCBJUHJvamVjdEZhY2V0IGZhY2V0ICk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2phdmFkb2MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9qYXZhZG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4Njk0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2phdmFkb2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08cHJvamVjdCBkZWZhdWx0PSJleHBvcnQtamF2YWRvYyI+Ci0JCi0gIDx0YXJnZXQgbmFtZT0iZXhwb3J0LWphdmFkb2MiPgotICAJPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5kaXIiIHZhbHVlPSJyZWZlcmVuY2UvYXBpIi8+Ci0gIAk8bWtkaXIgZGlyPSIke2phdmFkb2MuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2MuZGlyfSIvPgotICAJPG1rZGlyIGRpcj0iJHtqYXZhZG9jLmRpcn0iLz4KLSAgICA8amF2YWRvYwotICAgICAgbWF4bWVtb3J5PSIxMDI0bSIKLSAgICAgIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IiAKLSAgICAgIGFjY2Vzcz0icHJvdGVjdGVkIiAKLSAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgIHZlcnNpb249InRydWUiCi0gICAgICBzcGxpdGluZGV4PSJ0cnVlIiAKLSAgICAgIHVzZT0idHJ1ZSIKLSAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgotICAgICAgZXhlY3V0YWJsZT0iJHtlbnYuSkFWQV81X0hPTUV9L2Jpbi9qYXZhZG9jIj4KLSAgICAgIDxkb2N0aXRsZT5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrPC9kb2N0aXRsZT4KLSAgICAgIDxoZWFkZXI+PCFbQ0RBVEFbPGI+RmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yazwvYj48YnIvPlZlcnNpb24gMS4zXV0+PC9oZWFkZXI+Ci0gICAgICA8Zm9vdGVyPjwhW0NEQVRBWzxiPkZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcms8L2I+PGJyLz5WZXJzaW9uIDEuM11dPjwvZm9vdGVyPgotICAgICAgPGJvdHRvbT48IVtDREFUQVtDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9ib3R0b20+Ci0gICAgICA8Z3JvdXAgdGl0bGU9IkNvcmUgUGFja2FnZXMiIHBhY2thZ2VzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS4qIi8+Ci0gICAgICA8Z3JvdXAgdGl0bGU9IlVJIFBhY2thZ2VzIiBwYWNrYWdlcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIi8+Ci0gICAgICA8cGFja2FnZXNldCBkaXI9Ii4uL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaW50ZXJuYWwvKioiLz4KLSAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaW50ZXJuYWwvKioiLz4KLSAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkBkb3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41L2RvY3MvYXBpIiBvZmZsaW5lPSJ0cnVlIiBwYWNrYWdlbGlzdExvYz0icGFja2FnZS1saXN0cy9qYXZhIi8+Ci0gICAgICA8bGluayBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9yZWZlcmVuY2UvYXBpIiBvZmZsaW5lPSJ0cnVlIiBwYWNrYWdlbGlzdExvYz0icGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtIi8+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtL3BhY2thZ2UtbGlzdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyYzcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvZWNsaXBzZS1wbGF0Zm9ybS9wYWNrYWdlLWxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotb3JnLmVjbGlwc2UuYW50LmNvcmUKLW9yZy5lY2xpcHNlLmNvbXBhcmUKLW9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyCi1vcmcuZWNsaXBzZS5jb21wYXJlLnBhdGNoCi1vcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIKLW9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIKLW9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMKLW9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uCi1vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzCi1vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuY29udmVyc2lvbgotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlCi1vcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLm9ic2VydmFibGUubGlzdAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLm1hcAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLm1hc3RlcmRldGFpbAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLnNldAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLnZhbHVlCi1vcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLnV0aWwKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcudmFsaWRhdGlvbgotb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucwotb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycwotb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5tYW5pcHVsYXRpb24KLW9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbQotb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyCi1vcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eQotb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnJlZnJlc2gKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRlYW0KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50Ci1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuZHluYW1pY2hlbHBlcnMKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzCi1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUubW9kZWwKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcwotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnNwaQotb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuY29tbWFuZHMKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwCi1vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzCi1vcmcuZWNsaXBzZS5kZWJ1Zy51aQotb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucwotb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZQotb3JnLmVjbGlwc2UuZGVidWcudWkuY29udGV4dHMKLW9yZy5lY2xpcHNlLmRlYnVnLnVpLm1lbW9yeQotb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwCi1vcmcuZWNsaXBzZS5lcXVpbm94LmFwcAotb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5Ci1vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAucmVnaXN0cnkKLW9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0Ci1vcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIKLW9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeQotb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5hdXRoCi1vcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LmF1dGguY3JlZGVudGlhbHMKLW9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuYXV0aC5tb2R1bGUKLW9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc3RvcmFnZQotb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5zdG9yYWdlLnByb3ZpZGVyCi1vcmcuZWNsaXBzZS5oZWxwCi1vcmcuZWNsaXBzZS5oZWxwLmJyb3dzZXIKLW9yZy5lY2xpcHNlLmhlbHAuc2VhcmNoCi1vcmcuZWNsaXBzZS5oZWxwLnN0YW5kYWxvbmUKLW9yZy5lY2xpcHNlLmhlbHAudWkKLW9yZy5lY2xpcHNlLmhlbHAudWkuYnJvd3Nlcgotb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uCi1vcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncwotb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cwotb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nCi1vcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kcwotb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UuY29udGV4dHMKLW9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dAotb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycwotb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcud2l6YXJkCi1vcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzCi1vcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0Ci1vcmcuZWNsaXBzZS5qZmFjZS5tZW51cwotb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uCi1vcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlCi1vcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZQotb3JnLmVjbGlwc2UuamZhY2UudGV4dAotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0Ci1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlcgotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluawotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJvamVjdGlvbgotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJldmlzaW9ucwotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcwotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZQotb3JnLmVjbGlwc2UuamZhY2UudXRpbAotb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycwotb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZAotb3JnLmVjbGlwc2UuamZhY2Uud2luZG93Ci1vcmcuZWNsaXBzZS5qZmFjZS53aXphcmQKLW9yZy5lY2xpcHNlLmpzY2guY29yZQotb3JnLmVjbGlwc2UuanNjaC51aQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmhpc3RvcnkKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLm1vZGVsCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlc291cmNlCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcKLW9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5hY3Rpb25zCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuaGlzdG9yeQotb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLm1vZGVsCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcucmVzb3VyY2UKLW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24KLW9yZy5lY2xpcHNlLm9zZ2kudXRpbAotb3JnLmVjbGlwc2Uuc2VhcmNoLmNvcmUudGV4dAotb3JnLmVjbGlwc2Uuc2VhcmNoLnVpCi1vcmcuZWNsaXBzZS5zZWFyY2gudWkuYWN0aW9ucwotb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQKLW9yZy5lY2xpcHNlLnN3dAotb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkKLW9yZy5lY2xpcHNlLnN3dC5hd3QKLW9yZy5lY2xpcHNlLnN3dC5icm93c2VyCi1vcmcuZWNsaXBzZS5zd3QuY3VzdG9tCi1vcmcuZWNsaXBzZS5zd3QuZG5kCi1vcmcuZWNsaXBzZS5zd3QuZXZlbnRzCi1vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MKLW9yZy5lY2xpcHNlLnN3dC5sYXlvdXQKLW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIKLW9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wKLW9yZy5lY2xpcHNlLnN3dC5wcmludGluZwotb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0KLW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5kaWZmCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUuZGlmZi5wcm92aWRlcgotb3JnLmVjbGlwc2UudGVhbS5jb3JlLmhpc3RvcnkKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5oaXN0b3J5LnByb3ZpZGVyCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUubWFwcGluZwotb3JnLmVjbGlwc2UudGVhbS5jb3JlLm1hcHBpbmcucHJvdmlkZXIKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5zdWJzY3JpYmVycwotb3JnLmVjbGlwc2UudGVhbS5jb3JlLnN5bmNocm9uaXplCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUudmFyaWFudHMKLW9yZy5lY2xpcHNlLnRlYW0udWkKLW9yZy5lY2xpcHNlLnRlYW0udWkuaGlzdG9yeQotb3JnLmVjbGlwc2UudGVhbS51aS5tYXBwaW5nCi1vcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplCi1vcmcuZWNsaXBzZS50ZXh0LmVkaXRzCi1vcmcuZWNsaXBzZS50ZXh0LnVuZG8KLW9yZy5lY2xpcHNlLnVpCi1vcmcuZWNsaXBzZS51aS5hYm91dAotb3JnLmVjbGlwc2UudWkuYWN0aW9ucwotb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcwotb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24KLW9yZy5lY2xpcHNlLnVpLmJyYW5kaW5nCi1vcmcuZWNsaXBzZS51aS5icm93c2VyCi1vcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cwotb3JnLmVjbGlwc2UudWkuY29tbWFuZHMKLW9yZy5lY2xpcHNlLnVpLmNvbnNvbGUKLW9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuYWN0aW9ucwotb3JnLmVjbGlwc2UudWkuY29udGVudGFzc2lzdAotb3JnLmVjbGlwc2UudWkuY29udGV4dHMKLW9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MKLW9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dAotb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcwotb3JnLmVjbGlwc2UudWkuZmllbGRhc3Npc3QKLW9yZy5lY2xpcHNlLnVpLmZvcm1zCi1vcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IKLW9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cwotb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cwotb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMKLW9yZy5lY2xpcHNlLnVpLmhlbHAKLW9yZy5lY2xpcHNlLnVpLmlkZQotb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3MKLW9yZy5lY2xpcHNlLnVpLmlkZS5maWxlU3lzdGVtCi1vcmcuZWNsaXBzZS51aS5pZGUudW5kbwotb3JnLmVjbGlwc2UudWkuaW50cm8KLW9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZwotb3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsCi1vcmcuZWNsaXBzZS51aS5rZXlzCi1vcmcuZWNsaXBzZS51aS5tZW51cwotb3JnLmVjbGlwc2UudWkubW9kZWwKLW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcgotb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcwotb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucwotb3JnLmVjbGlwc2UudWkucGFydAotb3JnLmVjbGlwc2UudWkucGx1Z2luCi1vcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcwotb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucwotb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MKLW9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzCi1vcmcuZWNsaXBzZS51aS5zdGF0dXNoYW5kbGVycwotb3JnLmVjbGlwc2UudWkuc3d0Ci1vcmcuZWNsaXBzZS51aS50ZXN0aW5nCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLmxpbmsKLW9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucXVpY2tkaWZmCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVycwotb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZwotb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMKLW9yZy5lY2xpcHNlLnVpLnRoZW1lcwotb3JnLmVjbGlwc2UudWkudmlld3MKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1vcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3QKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcgotb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcwotb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0Ci1vcmcuZWNsaXBzZS51aS53aXphcmRzCi1vcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlcgotb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZQotb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IKLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbAotb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2gKLW9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvamF2YS9wYWNrYWdlLWxpc3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvamF2YS9wYWNrYWdlLWxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzgzMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wYWNrYWdlLWxpc3RzL2phdmEvcGFja2FnZS1saXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLWphdmEuYXBwbGV0Ci1qYXZhLmF3dAotamF2YS5hd3QuY29sb3IKLWphdmEuYXd0LmRhdGF0cmFuc2ZlcgotamF2YS5hd3QuZG5kCi1qYXZhLmF3dC5ldmVudAotamF2YS5hd3QuZm9udAotamF2YS5hd3QuZ2VvbQotamF2YS5hd3QuaW0KLWphdmEuYXd0LmltLnNwaQotamF2YS5hd3QuaW1hZ2UKLWphdmEuYXd0LmltYWdlLnJlbmRlcmFibGUKLWphdmEuYXd0LnByaW50Ci1qYXZhLmJlYW5zCi1qYXZhLmJlYW5zLmJlYW5jb250ZXh0Ci1qYXZhLmlvCi1qYXZhLmxhbmcKLWphdmEubGFuZy5hbm5vdGF0aW9uCi1qYXZhLmxhbmcuaW5zdHJ1bWVudAotamF2YS5sYW5nLm1hbmFnZW1lbnQKLWphdmEubGFuZy5yZWYKLWphdmEubGFuZy5yZWZsZWN0Ci1qYXZhLm1hdGgKLWphdmEubmV0Ci1qYXZhLm5pbwotamF2YS5uaW8uY2hhbm5lbHMKLWphdmEubmlvLmNoYW5uZWxzLnNwaQotamF2YS5uaW8uY2hhcnNldAotamF2YS5uaW8uY2hhcnNldC5zcGkKLWphdmEucm1pCi1qYXZhLnJtaS5hY3RpdmF0aW9uCi1qYXZhLnJtaS5kZ2MKLWphdmEucm1pLnJlZ2lzdHJ5Ci1qYXZhLnJtaS5zZXJ2ZXIKLWphdmEuc2VjdXJpdHkKLWphdmEuc2VjdXJpdHkuYWNsCi1qYXZhLnNlY3VyaXR5LmNlcnQKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcwotamF2YS5zZWN1cml0eS5zcGVjCi1qYXZhLnNxbAotamF2YS50ZXh0Ci1qYXZhLnV0aWwKLWphdmEudXRpbC5jb25jdXJyZW50Ci1qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzCi1qYXZhLnV0aWwuamFyCi1qYXZhLnV0aWwubG9nZ2luZwotamF2YS51dGlsLnByZWZzCi1qYXZhLnV0aWwucmVnZXgKLWphdmEudXRpbC56aXAKLWphdmF4LmFjY2Vzc2liaWxpdHkKLWphdmF4LmFjdGl2aXR5Ci1qYXZheC5jcnlwdG8KLWphdmF4LmNyeXB0by5pbnRlcmZhY2VzCi1qYXZheC5jcnlwdG8uc3BlYwotamF2YXguaW1hZ2VpbwotamF2YXguaW1hZ2Vpby5ldmVudAotamF2YXguaW1hZ2Vpby5tZXRhZGF0YQotamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcAotamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcKLWphdmF4LmltYWdlaW8uc3BpCi1qYXZheC5pbWFnZWlvLnN0cmVhbQotamF2YXgubWFuYWdlbWVudAotamF2YXgubWFuYWdlbWVudC5sb2FkaW5nCi1qYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4KLWphdmF4Lm1hbmFnZW1lbnQubW9uaXRvcgotamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4KLWphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24KLWphdmF4Lm1hbmFnZW1lbnQucmVtb3RlCi1qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkKLWphdmF4Lm1hbmFnZW1lbnQudGltZXIKLWphdmF4Lm5hbWluZwotamF2YXgubmFtaW5nLmRpcmVjdG9yeQotamF2YXgubmFtaW5nLmV2ZW50Ci1qYXZheC5uYW1pbmcubGRhcAotamF2YXgubmFtaW5nLnNwaQotamF2YXgubmV0Ci1qYXZheC5uZXQuc3NsCi1qYXZheC5wcmludAotamF2YXgucHJpbnQuYXR0cmlidXRlCi1qYXZheC5wcmludC5hdHRyaWJ1dGUuc3RhbmRhcmQKLWphdmF4LnByaW50LmV2ZW50Ci1qYXZheC5ybWkKLWphdmF4LnJtaS5DT1JCQQotamF2YXgucm1pLnNzbAotamF2YXguc2VjdXJpdHkuYXV0aAotamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjawotamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcwotamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbgotamF2YXguc2VjdXJpdHkuYXV0aC5zcGkKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMAotamF2YXguc2VjdXJpdHkuY2VydAotamF2YXguc2VjdXJpdHkuc2FzbAotamF2YXguc291bmQubWlkaQotamF2YXguc291bmQubWlkaS5zcGkKLWphdmF4LnNvdW5kLnNhbXBsZWQKLWphdmF4LnNvdW5kLnNhbXBsZWQuc3BpCi1qYXZheC5zcWwKLWphdmF4LnNxbC5yb3dzZXQKLWphdmF4LnNxbC5yb3dzZXQuc2VyaWFsCi1qYXZheC5zcWwucm93c2V0LnNwaQotamF2YXguc3dpbmcKLWphdmF4LnN3aW5nLmJvcmRlcgotamF2YXguc3dpbmcuY29sb3JjaG9vc2VyCi1qYXZheC5zd2luZy5ldmVudAotamF2YXguc3dpbmcuZmlsZWNob29zZXIKLWphdmF4LnN3aW5nLnBsYWYKLWphdmF4LnN3aW5nLnBsYWYuYmFzaWMKLWphdmF4LnN3aW5nLnBsYWYubWV0YWwKLWphdmF4LnN3aW5nLnBsYWYubXVsdGkKLWphdmF4LnN3aW5nLnBsYWYuc3ludGgKLWphdmF4LnN3aW5nLnRhYmxlCi1qYXZheC5zd2luZy50ZXh0Ci1qYXZheC5zd2luZy50ZXh0Lmh0bWwKLWphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIKLWphdmF4LnN3aW5nLnRleHQucnRmCi1qYXZheC5zd2luZy50cmVlCi1qYXZheC5zd2luZy51bmRvCi1qYXZheC50cmFuc2FjdGlvbgotamF2YXgudHJhbnNhY3Rpb24ueGEKLWphdmF4LnhtbAotamF2YXgueG1sLmRhdGF0eXBlCi1qYXZheC54bWwubmFtZXNwYWNlCi1qYXZheC54bWwucGFyc2VycwotamF2YXgueG1sLnRyYW5zZm9ybQotamF2YXgueG1sLnRyYW5zZm9ybS5kb20KLWphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Ci1qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbQotamF2YXgueG1sLnZhbGlkYXRpb24KLWphdmF4LnhtbC54cGF0aAotb3JnLmlldGYuamdzcwotb3JnLm9tZy5DT1JCQQotb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlCi1vcmcub21nLkNPUkJBLk9SQlBhY2thZ2UKLW9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlCi1vcmcub21nLkNPUkJBLnBvcnRhYmxlCi1vcmcub21nLkNPUkJBXzJfMwotb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUKLW9yZy5vbWcuQ29zTmFtaW5nCi1vcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0UGFja2FnZQotb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UKLW9yZy5vbWcuRHluYW1pYwotb3JnLm9tZy5EeW5hbWljQW55Ci1vcmcub21nLkR5bmFtaWNBbnkuRHluQW55RmFjdG9yeVBhY2thZ2UKLW9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlQYWNrYWdlCi1vcmcub21nLklPUAotb3JnLm9tZy5JT1AuQ29kZWNGYWN0b3J5UGFja2FnZQotb3JnLm9tZy5JT1AuQ29kZWNQYWNrYWdlCi1vcmcub21nLk1lc3NhZ2luZwotb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yCi1vcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IuT1JCSW5pdEluZm9QYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLkN1cnJlbnRQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQU1hbmFnZXJQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQVBhY2thZ2UKLW9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudExvY2F0b3JQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlCi1vcmcub21nLlNlbmRpbmdDb250ZXh0Ci1vcmcub21nLnN0dWIuamF2YS5ybWkKLW9yZy53M2MuZG9tCi1vcmcudzNjLmRvbS5ib290c3RyYXAKLW9yZy53M2MuZG9tLmV2ZW50cwotb3JnLnczYy5kb20ubHMKLW9yZy54bWwuc2F4Ci1vcmcueG1sLnNheC5leHQKLW9yZy54bWwuc2F4LmhlbHBlcnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYwZmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBFY2xpcHNlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgQVBJIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNmM2MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiPgotICAgIDwvdG9jPgotICA8L2V4dGVuc2lvbj4KLQkKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UucGRlLmNvcmUuamF2YWRvYyI+Ci0gICAgPGphdmFkb2MgcGF0aD0icmVmZXJlbmNlL2FwaSI+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIi8+Ci0gICAgPC9qYXZhZG9jPgotICA8L2V4dGVuc2lvbj4KLSAgIAkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9zcmMvLmRvLW5vdC1kZWxldGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3NyYy8uZG8tbm90LWRlbGV0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3NyYy8uZG8tbm90LWRlbGV0ZQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3RvYy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZmFiODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgRGV2ZWxvcGVyIEd1aWRlIj4KLQotICA8dG9waWMgbGFiZWw9IlByb2dyYW1tZXIncyBHdWlkZSIgaHJlZj0iZ3VpZGUvZGVzY3JpcHRpb24uaHRtbCI+Ci0gICAgPHRvcGljIAotICAgICAgbGFiZWw9IlR1dG9yaWFsIiAKLSAgICAgIGhyZWY9Imd1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmh0bWwiLz4KLSAgICA8dG9waWMgCi0gICAgICBsYWJlbD0iTGlzdGVuaW5nIGZvciBDaGFuZ2VzIHRvIEZhY2V0ZWQgUHJvamVjdHMiCi0gICAgICBocmVmPSJndWlkZS9saXN0ZW5lcnMuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJFbmFibGluZyBVSSBFbGVtZW50cyBCYXNlZCBvbiBQcm9qZWN0IEZhY2V0cyIKLSAgICAgIGhyZWY9Imd1aWRlL2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sIi8+Ci0gICAgPHRvcGljIGxhYmVsPSJRdWVzdGlvbnMgJmFtcDsgQW5zd2VycyI+Ci0gICAgICAgPHRvcGljIGhyZWY9Imd1aWRlL2Fuc3dlcnMvcHJvamVjdEZhY2V0UHJlZmVyZW5jZXMuaHRtbCIgbGFiZWw9Ik1hbmFnaW5nIFByZWZlcmVuY2VzIj4KLSAgICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIAotICAgICAgbGFiZWw9Ik5ldyBmb3IgMS41IgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXcxNTAuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDEuNS4xIgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXcxNTEuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDIuMCIKLSAgICAgIGhyZWY9Imd1aWRlL3doYXRzbmV3MjAuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDMuMC4xIgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXczMDEuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDMuMSIKLSAgICAgIGhyZWY9Imd1aWRlL3doYXRzbmV3MzEwLmh0bWwiLz4KLSAgPC90b3BpYz4KLSAgICAKLSAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgIDx0b3BpYyBsYWJlbD0iQVBJIFJlZmVyZW5jZSIgaHJlZj0icmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgotICAgICAgPHRvcGljIAotICAgICAgICBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiCi0gICAgICAgIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLz4KLSAgICAgIDx0b3BpYwotICAgICAgICBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzIgotICAgICAgICBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPgotICAgICAgPHRvcGljCi0gICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lIgotICAgICAgICBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLz4KLSAgICAgIDx0b3BpYwotICAgICAgICBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMiCi0gICAgICAgIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLz4KLSAgICAgIDx0b3BpYwotICAgICAgICBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbCIKLSAgICAgICAgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIi8+Ci0gICAgICA8dG9waWMKLSAgICAgICAgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIKLSAgICAgICAgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLz4KLSAgICA8L3RvcGljPgotICA8L3RvcGljPiAgIAotICAgICAgCi08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjYyZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWZhY2V0LXVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTBiMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcHJvcFBhZ2UvYWN0aW9uQ29uZmlnVmFsaWRhdGlvbiA9IGZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTJmMzcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzI2ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBKYW4gMzEgMTU6MzI6MTIgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGY1YzJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuRmFjZXRVaVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgc2NoZW1hcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9kZWZhdWx0LXJ1bnRpbWUtaW1hZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2RlZmF1bHQtcnVudGltZS1pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2RlZmF1bHQtcnVudGltZS1pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvZG93bi1hcnJvdy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvZG93bi1hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNzkzNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2Rvd24tYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2Vycm9yLW92ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2Vycm9yLW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9mYWNldHMtcGFnZS13aXpiYW4ucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2ZhY2V0cy1wYWdlLXdpemJhbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWMxMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2ZhY2V0cy1wYWdlLXdpemJhbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvbG9jay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvbG9jay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmE5YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2xvY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL25ld3Byai13aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL25ld3Byai13aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJhYzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9uZXdwcmotd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9uZXdwcmotd2l6YmFuLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9uZXdwcmotd2l6YmFuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmZjAxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvbmV3cHJqLXdpemJhbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvb3ZlcmxheXMvZXJyb3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvb3ZlcmxheXMvZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL292ZXJsYXlzL3dhcm5pbmcucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL292ZXJsYXlzL3dhcm5pbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFlODZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9vdmVybGF5cy93YXJuaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9wcmltYXJ5LXJ1bnRpbWUtb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvcHJpbWFyeS1ydW50aW1lLW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9wcmltYXJ5LXJ1bnRpbWUtb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvdW5rbm93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvdW5rbm93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2M2YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL3Vua25vd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL3dhcm5pbmctb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvd2FybmluZy1vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZGFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvd2FybmluZy1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjlkZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBsdWdpbk5hbWUgPSBFY2xpcHNlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgVUkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wcm9qZWN0LmZhY2V0cyA9IFByb2plY3QgRmFjZXRzCi1ydW50aW1lc1Byb3BlcnR5UGFnZUxhYmVsID0gVGFyZ2V0ZWQgUnVudGltZXMKLWJhc2ljRmFjZXRlZFByb2plY3RXaXphcmROYW1lID0gRmFjZXRlZCBQcm9qZWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MmRiOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbi1wb2ludCAKLSAgICBpZD0id2l6YXJkIgotICAgIG5hbWU9IlByb2plY3QgRmFjZXQgV2l6YXJkIFBhZ2VzIEV4dGVuc2lvbiBQb2ludCAoRGVwcmVjYXRlZCkiCi0gICAgc2NoZW1hPSJzY2hlbWFzL3dpemFyZC1wYWdlcy1vbGQuZXhzZCIvPgotCi0gIDxleHRlbnNpb24tcG9pbnQgCi0gICAgaWQ9IndpemFyZFBhZ2VzIgotICAgIG5hbWU9IlByb2plY3QgRmFjZXQgV2l6YXJkIFBhZ2VzIEV4dGVuc2lvbiBQb2ludCIKLSAgICBzY2hlbWE9InNjaGVtYXMvd2l6YXJkLXBhZ2VzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJpbWFnZXMiCi0gICAgbmFtZT0iUHJvamVjdCBGYWNldCBJbWFnZXMgRXh0ZW5zaW9uIFBvaW50IgotICAgIHNjaGVtYT0ic2NoZW1hcy9pbWFnZXMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkRlY29yYXRpb25zUHJvdmlkZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0Ij4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRGVjb3JhdGlvbnNQcm92aWRlciIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuRGVjb3JhdGlvbnNQcm92aWRlciRGYWN0b3J5IiAKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDYXRlZ29yeSI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSURlY29yYXRpb25zUHJvdmlkZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkRlY29yYXRpb25zUHJvdmlkZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbiI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSURlY29yYXRpb25zUHJvdmlkZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuUnVudGltZURlY29yYXRpb25zUHJvdmlkZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRGVjb3JhdGlvbnNQcm92aWRlciIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlciRGYWN0b3J5IiAKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgPHBhZ2UKLSAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuRmFjZXRzUHJvcGVydHlQYWdlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5GYWNldHNQcm9wZXJ0eVBhZ2UiCi0gICAgICBuYW1lPSIlcHJvamVjdC5mYWNldHMiCi0gICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgPGZpbHRlcgotICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5uYXR1cmUiPgotICAgICAgPC9maWx0ZXI+Ci0gICAgPC9wYWdlPgotICAgIDxwYWdlCi0gICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLlJ1bnRpbWVzUHJvcGVydHlQYWdlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5SdW50aW1lc1Byb3BlcnR5UGFnZSIKLSAgICAgIG5hbWU9IiVydW50aW1lc1Byb3BlcnR5UGFnZUxhYmVsIgotICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubmF0dXJlIj4KLSAgICAgIDwvZmlsdGVyPgotICAgIDwvcGFnZT4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICA8d2l6YXJkCi0gICAgICBjYW5GaW5pc2hFYXJseT0iZmFsc2UiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkJhc2ljRmFjZXRlZFByb2plY3RXaXphcmQiCi0gICAgICBoYXNQYWdlcz0idHJ1ZSIKLSAgICAgIGljb249ImltYWdlcy9uZXdwcmotd2l6LmdpZiIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZCIKLSAgICAgIG5hbWU9IiViYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkTmFtZSIKLSAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMiPgotICAgIDwvd2l6YXJkPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zY2hlbWFzL2ltYWdlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc2NoZW1hcy9pbWFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MTM1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zY2hlbWFzL2ltYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiIGlkPSJpbWFnZXMiIG5hbWU9IlByb2plY3QgRmFjZXQgSW1hZ2VzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBpbWFnZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdpdGggYSBmYWNldCwgYSBjYXRlZ29yeSwgb3IgYSBydW50aW1lIGNvbXBvbmVudCB0eXBlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1hZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImltYWdlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZhY2V0LCBjYXRlZ29yeSwgb3IgcnVudGltZSBjb21wb25lbnQgdHlwZS4gT25seSBvbmUgb2YgdGhlICZsdDtpJmd0O2ZhY2V0Jmx0Oy9pJmd0OywgJmx0O2kmZ3Q7Y2F0ZWdvcnkmbHQ7L2kmZ3Q7LCBhbmQgJmx0O2kmZ3Q7cnVudGltZS1jb21wb25lbnQtdHlwZSZsdDsvaSZndDsgYXR0cmlidXRlcyBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByb2plY3QgZmFjZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNhdGVnb3J5IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUtY29tcG9uZW50LXR5cGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaW1hZ2Ugd2l0aGluIHRoaXMgcGx1Z2luLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHNwZWNpZnlpbmcgYW4gaW1hZ2UgZm9yIGEgcnVudGltZSBjb21wb25lbnQgdHlwZS4gSXQgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIHRoYXQgdGhpcyBpbWFnZSBhcHBsaWVzIHRvLiBNdWx0aXBsZSB2ZXJzaW9ucyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHZlcnNpb24gZXhwcmVzc2lvbiBzeW50YXguIFRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLiBJZiBvbWl0dGVkLCB0aGUgaW1hZ2UgYXBwbGllcyB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhlIGZvbGxvd2luZyBleGFtcGxlIGFzc29jaWF0ZXMgaW1hZ2VzIHdpdGggdHdvIGZhY2V0cyBhbmQgYSBjYXRlZ29yeS4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMmcXVvdDsmZ3Q7Ci0gICZsdDtpbWFnZSBmYWNldD0mcXVvdDtmYWNldDEmcXVvdDsgcGF0aD0mcXVvdDtpY29ucy9mYWNldDEuZ2lmJnF1b3Q7LyZndDsKLSAgJmx0O2ltYWdlIGZhY2V0PSZxdW90O2ZhY2V0MiZxdW90OyBwYXRoPSZxdW90O2ljb25zL2ZhY2V0Mi5naWYmcXVvdDsvJmd0OwotICAmbHQ7aW1hZ2UgY2F0ZWdvcnk9JnF1b3Q7Y2F0ZWdvcnkxJnF1b3Q7IHBhdGg9JnF1b3Q7aWNvbnMvY2F0ZWdvcnkxLmdpZiZxdW90Oy8mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUgYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc2NoZW1hcy93aXphcmQtcGFnZXMtb2xkLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zY2hlbWFzL3dpemFyZC1wYWdlcy1vbGQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkZTA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zY2hlbWFzL3dpemFyZC1wYWdlcy1vbGQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgaWQ9IndpemFyZCIgbmFtZT0iUHJvamVjdCBGYWNldCBXaXphcmQgUGFnZXMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQtcGFnZXMiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIiBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZC1wYWdlcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVuaW5zdGFsbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imluc3RhbGwiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idW5pbnN0YWxsIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhZ2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRmFjZXRXaXphcmRQYWdlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NjaGVtYXMvd2l6YXJkLXBhZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zY2hlbWFzL3dpemFyZC1wYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYwYzgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NjaGVtYXMvd2l6YXJkLXBhZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiIGlkPSJ3aXphcmRQYWdlcyIgbmFtZT0iUHJvamVjdCBGYWNldCBXaXphcmQgUGFnZXMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFVzZWQgZm9yIGFzc29jaWF0aW5nIHdpemFyZCBwYWdlcyB3aXRoIGEgcHJvamVjdCBmYWNldCBhY3Rpb24uIEZvciBpbnN0YW5jZSwgd2l6YXJkIHBhZ2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGlvbiBvZiBpbnN0YWxsaW5nIGZhY2V0IEFiYyBvciB1bmluc3RhbGxpbmcgZmFjZXQgRm9vQmFyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZC1wYWdlcyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkLXBhZ2VzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBVc2VkIGZvciBhc3NvY2lhdGluZyB3aXphcmQgcGFnZXMgd2l0aCBhIHByb2plY3QgZmFjZXQgYWN0aW9uLiBGb3IgaW5zdGFuY2UsIHdpemFyZCBwYWdlcyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3Rpb24gb2YgaW5zdGFsbGluZyBmYWNldCBBYmMgb3IgdW5pbnN0YWxsaW5nIGZhY2V0IEZvb0Jhci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWN0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBhY3Rpb24gaWQuIElmIHRoZSBhY3Rpb24gZG9lcyBub3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBpZCwgdGhlIGRlZmF1bHQgaWQgaXMgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDogJnF1b3Q7W2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwYWdlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgb25lIHBhZ2UgaW4gYSBzZXF1ZW5jZSBvZiB3aXphcmQgcGFnZXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdCBmYWNldCBhY3Rpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLiBIYXMgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRmFjZXRXaXphcmRQYWdlIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRmFjZXRXaXphcmRQYWdlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDtUaGUgZm9sbG93aW5nIGV4YW1wbGUgYXNzb2NpYXRlcyB3aXphcmQgcGFnZXMgd2l0aCBpbnN0YWxsIGFuZCB1bmluc3RhbGwgYWN0aW9ucyBvZiBmYWNldDEuJmx0Oy9wJmd0OwotCi0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICZsdDt3aXphcmQtcGFnZXMgYWN0aW9uPSZxdW90O2ZhY2V0MS5pbnN0YWxsJnF1b3Q7Jmd0OwotICAgICZsdDtwYWdlIGNsYXNzPSZxdW90O2NvbS5teWNvcnAuRmFjZXQxSW5zdGFsbFBhZ2UxJnF1b3Q7LyZndDsKLSAgICAmbHQ7cGFnZSBjbGFzcz0mcXVvdDtjb20ubXljb3JwLkZhY2V0MUluc3RhbGxQYWdlMiZxdW90Oy8mZ3Q7Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotICAmbHQ7d2l6YXJkLXBhZ2VzIGFjdGlvbj0mcXVvdDtmYWNldDEudW5pbnN0YWxsJnF1b3Q7Jmd0OwotICAgICZsdDtwYWdlIGNsYXNzPSZxdW90O2NvbS5teWNvcnAuRmFjZXQxVW5pbnN0YWxsUGFnZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1ZGQ1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0Fic3RyYWN0RmFjZXRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UKLQotICAgIGV4dGVuZHMgV2l6YXJkUGFnZQotICAgIGltcGxlbWVudHMgSUZhY2V0V2l6YXJkUGFnZQotICAgIAotewotICAgIHByb3RlY3RlZCBJV2l6YXJkQ29udGV4dCBjb250ZXh0OwotICAgIAotICAgIHB1YmxpYyBBYnN0cmFjdEZhY2V0V2l6YXJkUGFnZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0V2l6YXJkQ29udGV4dCggZmluYWwgSVdpemFyZENvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0cmFuc2ZlclN0YXRlVG9Db25maWcoKQotICAgIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9BZGRSZW1vdmVGYWNldHNXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvQWRkUmVtb3ZlRmFjZXRzV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTUxNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9BZGRSZW1vdmVGYWNldHNXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqIEBkZXByZWNhdGVkIHVzZSBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCBjbGFzcyBpbnN0ZWFkCi0gKi8KLQotcHVibGljIGNsYXNzIEFkZFJlbW92ZUZhY2V0c1dpemFyZCAKLQotICAgIGV4dGVuZHMgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQgCi0gICAgCi17Ci0gICAgcHVibGljIEFkZFJlbW92ZUZhY2V0c1dpemFyZCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBmcHJvaiApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9CYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOTNlNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9CYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLQotLyoqCi0gKiBBIGJhc2ljIHdpemFyZCBmb3IgY3JlYXRpbmcgZmFjZXRlZCBwcm9qZWN0cy4gVGhpcyB3aXphcmQgaXMgYXZhaWxhYmxlIGRpcmVjdGx5Ci0gKiB0byB0aGUgdXNlcnMgYXMgIkJhc2ljL0ZhY2V0ZWQgUHJvamVjdCIgaW4gdGhlIG5ldyBwcm9qZWN0IGRpYWxvZywgYnV0IGNhbiBhbHNvCi0gKiBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZCAKLQotICAgIGV4dGVuZHMgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQgCi0gICAgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBJV2l6YXJkUGFnZSBmaXJzdFBhZ2U7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZCgpCi0gICAgewotICAgICAgICB0aGlzLnNldFdpbmRvd1RpdGxlKCBSZXNvdXJjZXMud2l6YXJkVGl0bGUgKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoIGdldEltYWdlRGVzY3JpcHRvciggImltYWdlcy9uZXdwcmotd2l6YmFuLnBuZyIgKSApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGluaXQoIGZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoLCAKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aXphcmQncyBmaXJzdCBwYWdlLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSB3aXphcmQncyBmaXJzdCBwYWdlCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldEZpcnN0UGFnZSgpCi0gICAgewotICAgIAlyZXR1cm4gdGhpcy5maXJzdFBhZ2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCB0aGF0IHRoaXMgd2l6YXJkIGJlbG9uZ3MgdG8uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd29ya2JlbmNoIHRoYXQgdGhpcyB3aXphcmQgYmVsb25ncyB0bwotICAgICAqIEBzaW5jZSAxLjQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud29ya2JlbmNoOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gdGhhdCB0aGlzIHdpemFyZCB3YXMgbGF1bmNoZWQgZnJvbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gdGhhdCB0aGlzIHdpemFyZCB3YXMgbGF1bmNoZWQgZnJvbQotICAgICAqIEBzaW5jZSAxLjQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2UuIFR5cGljYWxseSwgdGhpcyBpcyB3aGVyZSB0aGUgdXNlciBzcGVjaWZpZXMgdGhlCi0gICAgICogcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcnMgYSBiYXNpYyBmaXJzdCBwYWdlCi0gICAgICogcHJvdmlkZWQgYnkgdGhlIEVjbGlwc2UgUGxhdGZvcm0uIEV4dGVuZGVycyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gb3JkZXIgCi0gICAgICogdG8gc3VwcGx5IGEgY3VzdG9tIHBhZ2UuIEFueW9uZSBvdmVycmlkaW5nIHRoaXMgcGFnZSB3aWxsIHByb2JhYmx5IGFsc28gbmVlZCB0bwotICAgICAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2dldFByb2plY3ROYW1lKCl9IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBwYWdlIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoaXMgd2l6YXJkCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZSBmaXJzdFBhZ2UgPSBuZXcgQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZEZpcnN0UGFnZSggImZpcnN0LnBhZ2UiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlyc3RQYWdlLnNldFRpdGxlKCBSZXNvdXJjZXMud2l6YXJkVGl0bGUgKTsKLSAgICAgICAgZmlyc3RQYWdlLnNldERlc2NyaXB0aW9uKCBSZXNvdXJjZXMuZmlyc3RQYWdlRGVzY3JpcHRpb24gKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmaXJzdFBhZ2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgYnkgdGhlIHdpemFyZCB0byByZXRyaWV2ZSB0aGUgcHJvamVjdCBuYW1lIHRoYXQgdGhlIHVzZXIgc3BlY2lmaWVzIG9uIHRoZQotICAgICAqIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd29ya3Mgd2l0aCBhbnkgc3ViY2xhc3Mgb2YKLSAgICAgKiB0aGUge0BsaW5rIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2V9IGNsYXNzLiBFeHRlbmRlcnMgd2hvIG92ZXJyaWRlIHRoZQotICAgICAqIHtAbGluayAjY3JlYXRlRmlyc3RQYWdlKCl9IG1ldGhvZCB3aWxsIHByb2JhYmx5IGFsc28gbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0gICAgewotICAgIAlyZXR1cm4gKCAoV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSkgZ2V0Rmlyc3RQYWdlKCkgKS5nZXRQcm9qZWN0TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0UGFnZSA9IGNyZWF0ZUZpcnN0UGFnZSgpOwotICAgICAgICBhZGRQYWdlKCB0aGlzLmZpcnN0UGFnZSApOwotICAgICAgICBzdXBlci5hZGRQYWdlcygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRQYWdlcygpCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIGJhc2UgPSBzdXBlci5nZXRQYWdlcygpOwotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gbmV3IElXaXphcmRQYWdlWyBiYXNlLmxlbmd0aCArIDEgXTsKLSAgICAgICAgCi0gICAgICAgIHBhZ2VzWyAwIF0gPSB0aGlzLmZpcnN0UGFnZTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYmFzZSwgMCwgcGFnZXMsIDEsIGJhc2UubGVuZ3RoICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFnZXM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggZmluYWwgSVdpemFyZFBhZ2UgcGFnZSApCi0gICAgewotICAgICAgICBpZiggcGFnZSA9PSB0aGlzLmZpcnN0UGFnZSApCi0gICAgICAgIHsKLSAgICAgICAgCWZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotICAgICAgICAgICAgZnBqd2Muc2V0UHJvamVjdE5hbWUoIGdldFByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKCBwYWdlICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZpcnN0UGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmIHN1cGVyLmNhbkZpbmlzaCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgCi0gICAgewotICAgICAgICBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0KLSAgICAgICAgaWYoIHRoaXMuZmlyc3RQYWdlIGluc3RhbmNlb2YgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBmaW5hbCBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIG1haW5QYWdlID0gKFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UpIHRoaXMuZmlyc3RQYWdlOwotICAgICAgICAgICAgZmluYWwgSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cyA9IG1haW5QYWdlLmdldFNlbGVjdGVkV29ya2luZ1NldHMoKTsKLSAgICAgICAgICAgIGdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuYWRkVG9Xb3JraW5nU2V0cyggcHJvamVjdCwgd29ya2luZ1NldHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmRUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RQYWdlRGVzY3JpcHRpb247Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBCYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9CYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0Jhc2ljRmFjZXRlZFByb2plY3RXaXphcmQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiZGU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0Jhc2ljRmFjZXRlZFByb2plY3RXaXphcmQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotd2l6YXJkVGl0bGUgPSBGYWNldGVkIFByb2plY3QKLWZpcnN0UGFnZURlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGZhY2V0ZWQgcHJvamVjdCByZXNvdXJjZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9CYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkRmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWMzYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9CYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkRmlyc3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICogQHNpbmNlIDEuNAotICovCi0KLXB1YmxpYyBjbGFzcyBCYXNpY0ZhY2V0ZWRQcm9qZWN0V2l6YXJkRmlyc3RQYWdlCi0KLSAgICBleHRlbmRzIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UKLSAgICAKLXsKLSAgICBwdWJsaWMgQmFzaWNGYWNldGVkUHJvamVjdFdpemFyZEZpcnN0UGFnZSggZmluYWwgU3RyaW5nIHBhZ2VOYW1lICkgCi0gICAgewotICAgICAgICBzdXBlciggcGFnZU5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlQ29udHJvbCggcGFyZW50ICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotICAgICAgICAKLSAgICAgICAgY3JlYXRlV29ya2luZ1NldEdyb3VwKCBjb21wb3NpdGUsICggKEJhc2ljRmFjZXRlZFByb2plY3RXaXphcmQpIGdldFdpemFyZCgpICkuZ2V0U2VsZWN0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIm9yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UiIH0gKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udCggY29tcG9zaXRlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0ZhY2V0VWlIZWxwQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9GYWNldFVpSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5NTY0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0ZhY2V0VWlIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkZhY2V0VWlQbHVnaW47Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGhlbHAgY29udGV4dCBpZHMgZGVmaW5lZCBpbiB0aGUgZmFjZXQgVUkgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRVaUhlbHBDb250ZXh0SWRzCi17Ci0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgY29udGV4dCBpZCBmb3IgdGhlIG92ZXJhbGwgZmFjZXRzIHNlbGVjdGlvbiBwYWdlOiAgCi0gICAgICogIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5mYWNldHNTZWxlY3Rpb25QYWdlIi4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVFNfU0VMRUNUSU9OX1BBR0UKLSAgICAgICAgPSBGYWNldFVpUGx1Z2luLlBMVUdJTl9JRCArICIuZmFjZXRzU2VsZWN0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIEZhY2V0VWlIZWxwQ29udGV4dElkcygpIHt9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODQ4MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9GYWNldGVkUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZhY2V0ZWRQcm9qZWN0V2l6YXJkIAotCi0gICAgZXh0ZW5kcyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCAKLSAgICBpbXBsZW1lbnRzIElOZXdXaXphcmQKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlOwotICAgIHByaXZhdGUgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSBmaXJzdFBhZ2U7Ci0gICAgCi0gICAgcHVibGljIEZhY2V0ZWRQcm9qZWN0V2l6YXJkKCkKLSAgICB7Ci0gICAgICAgIHRoaXMudGVtcGxhdGUgPSBnZXRUZW1wbGF0ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0gICAgICAgIGZwandjLnNldFNlbGVjdGVkUHJlc2V0KCB0aGlzLnRlbXBsYXRlLmdldEluaXRpYWxQcmVzZXQoKS5nZXRJZCgpICk7Ci0gICAgICAgIGZwandjLnNldEZpeGVkUHJvamVjdEZhY2V0cyggdGhpcy50ZW1wbGF0ZS5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zZXRXaW5kb3dUaXRsZSggUmVzb3VyY2VzLm5ld1ByZWZpeCArIHRoaXMudGVtcGxhdGUuZ2V0TGFiZWwoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGRlZkltYWdlRGVzY3JpcHRvciA9IGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVmSW1hZ2VEZXNjcmlwdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCBkZWZJbWFnZURlc2NyaXB0b3IgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KCBmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCwgCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgICB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0UGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlKCAiZmlyc3QucGFnZSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLmZpcnN0UGFnZS5zZXRUaXRsZSggdGhpcy50ZW1wbGF0ZS5nZXRMYWJlbCgpICk7Ci0gICAgICAgIHRoaXMuZmlyc3RQYWdlLnNldERlc2NyaXB0aW9uKCBnZXRQYWdlRGVzY3JpcHRpb24oKSApOwotICAgIAotICAgICAgICBhZGRQYWdlKCB0aGlzLmZpcnN0UGFnZSApOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZpcnN0UGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmIHN1cGVyLmNhbkZpbmlzaCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRQYWdlcygpCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIGJhc2UgPSBzdXBlci5nZXRQYWdlcygpOwotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gbmV3IElXaXphcmRQYWdlWyBiYXNlLmxlbmd0aCArIDEgXTsKLSAgICAgICAgCi0gICAgICAgIHBhZ2VzWyAwIF0gPSB0aGlzLmZpcnN0UGFnZTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYmFzZSwgMCwgcGFnZXMsIDEsIGJhc2UubGVuZ3RoICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFnZXM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggZmluYWwgSVdpemFyZFBhZ2UgcGFnZSApCi0gICAgewotICAgICAgICBpZiggcGFnZSA9PSB0aGlzLmZpcnN0UGFnZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotICAgICAgICAgICAgZnBqd2Muc2V0UHJvamVjdE5hbWUoIHRoaXMuZmlyc3RQYWdlLmdldFByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgICAgIGZwandjLnNldFByb2plY3RMb2NhdGlvbiggdGhpcy5maXJzdFBhZ2UuZ2V0TG9jYXRpb25QYXRoKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKCBwYWdlICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWdlRGVzY3JpcHRpb24oKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQcmVmaXg7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdFdpemFyZC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvRmFjZXRlZFByb2plY3RXaXphcmQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvRmFjZXRlZFByb2plY3RXaXphcmQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwYzY5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0ZhY2V0ZWRQcm9qZWN0V2l6YXJkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1uZXdQcmVmaXggPSBOZXdcIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvSURlY29yYXRpb25zUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvSURlY29yYXRpb25zUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiOTQ2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lEZWNvcmF0aW9uc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRGVjb3JhdGlvbnNQcm92aWRlcgotewotICAgIEltYWdlRGVzY3JpcHRvciBnZXRJY29uKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lGYWNldFdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvSUZhY2V0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmIxMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvSUZhY2V0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZSB3aXphcmQgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHByb2plY3QKLSAqIGZhY2V0IGFjdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0V2l6YXJkUGFnZQotCi0gICAgZXh0ZW5kcyBJV2l6YXJkUGFnZQotICAgIAotewotICAgIC8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHdpemFyZAotICAgICAqIGNvbnRleHQgdG8gdGhlIHdpemFyZCBwYWdlLiBUaGUgd2l6YXJkIGNvbnRleHQgY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQKLSAgICAgKiBhYm91dCBvdGhlciBhY3Rpb25zIGJlaW5nIGNvbmZpZ3VyZWQgYnkgdGhlIHdpemFyZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgd2l6YXJkIGNvbnRleHQKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIHNldFdpemFyZENvbnRleHQoIElXaXphcmRDb250ZXh0IGNvbnRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBhY3Rpb24gY29uZmlnCi0gICAgICogb2JqZWN0IHRoYXQgdGhlIHdpemFyZCBwYWdlIHNob3VsZCBzYXZlIHVzZXIgc2VsZWN0aW9uIGludG8uIFRoZQotICAgICAqIHBvcHVsYXRlZCBjb25maWcgb2JqZWN0IHdpbGwgdGhlbiBiZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiBkZWxlZ2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBhY3Rpb24gY29uZmlnIG9iamVjdAotICAgICAqLwotICAgIAotICAgIHZvaWQgc2V0Q29uZmlnKCBPYmplY3QgY29uZmlnICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBwcmVzc2VkIHRoZSA8Y29kZT5GaW5pc2g8L2NvZGU+Ci0gICAgICogYnV0dG9uLiBJdCBhbGxvd3MgdGhlIHdpemFyZCBwYWdlIHRvIHRyYW5zZmVyIHVzZXIgc2VsZWN0aW9uIGludG8gdGhlCi0gICAgICogY29uZmlnIG9iamVjdC4gQWx0ZXJuYXRpdmUsIGluc3RlYWQgb2YgdXNpbmcgdGhpcyBtZXRob2QsIHRoZSB3aXphcmQKLSAgICAgKiBwYWdlIGNvdWxkIHVwZGF0ZSB0aGUgbW9kZWwgb24gdGhlIGZseSBhcyB0aGUgdXNlciBpcyBtYWtpbmcgY2hhbmdlcy4KLSAgICAgKi8KLQotICAgIHZvaWQgdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0MWQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyCi17Ci0gICAgU3RyaW5nIGdldExhYmVsKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lXaXphcmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL0lXaXphcmRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTJjNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9JV2l6YXJkQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZXhwb3NlZCB0byB0aGUgZmFjZXQgYWN0aW9uIHdpemFyZCBwYWdlcyB0aGF0IGFsbG93cyB0aGVtCi0gKiB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdpemFyZCBzdGF0ZS4KLSAqIAotICogQG5vZXh0ZW5kIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJV2l6YXJkQ29udGV4dCAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHdpemFyZCBpcyBvcGVyYXRpbmcgb24uIElmIHRoZQotICAgICAqIHdpemFyZCBpcyBpbiB0aGUgcHJvamVjdCBjcmVhdGlvbiBtb2RlLCB0aGUgcHJvamVjdCB3aWxsIG5vdCB5ZXQgZXhpc3QKLSAgICAgKiBpbiB0aGUgd29ya3NwYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgd2l6YXJkIGlzIG9wZXJhdGluZyBvbgotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBmYWNldHMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB3aXphcmQuIElmIHRoZSB3aXphcmQKLSAgICAgKiBpcyBpbiB0aGUgYWRkL3JlbW92ZSBmYWNldHMgbW9kZSAodnMuIHByb2plY3QgY3JlYXRpb24pLCB0aGlzIG1ldGhvZCB3aWxsIAotICAgICAqIHJldHVybiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIGEgcHJvamVjdCBhZnRlciBiZWluZyAKLSAgICAgKiBtb2RpZmllZCBieSB0aGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHdpemFyZCAoZWxlbWVudCB0eXBlOgotICAgICAqICAge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufSkKLSAgICAgKi8KLSAgICAKLSAgICBTZXQgZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmFjZXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZQotICAgICAqIHdpemFyZC4gU2VlIHtAbGluayAjZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCl9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gb25seSBpZiB0aGUgcHJvdmlkZWQgcHJvamVjdCBmYWNldCBpcwotICAgICAqICAgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB3aXphcmQKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzUHJvamVjdEZhY2V0U2VsZWN0ZWQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFjdGlvbnMgY3VycmVudGx5IHNwZWNpZmllZCBieSB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYWN0aW9ucyBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0gICAgICovCi0gICAgCi0gICAgU2V0IGdldEFjdGlvbnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgYWN0aW9uIG9mIHNwZWNpZmllZCB0eXBlIHRoYXQgYXBwbGllcyB0byB0aGUgc3BlY2lmaWVkIGZhY2V0LAotICAgICAqIGlmIHN1Y2ggYWN0aW9uIGV4aXN0cy4gSWYgdGhlIHdpemFyZCBpcyBpbiB0aGUgYWRkL3JlbW92ZSBmYWNldHMgbW9kZQotICAgICAqICh2cy4gcHJvamVjdCBjcmVhdGlvbiksIHlvdSBjYW5ub3QgZGVwZW5kIG9uIGZpbmRpbmcgdGhlIGluc3RhbGwgYWN0aW9uCi0gICAgICogZm9yIGEgcmVxdWlyZWQgZmFjZXQgYXMgdGhhdCBmYWNldCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBhY3Rpb24gdHlwZQotICAgICAqIEBwYXJhbSBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBBY3Rpb24gZ2V0QWN0aW9uKCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG8gbm90IHVzZSEgVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICAKLQlPYmplY3QgZ2V0Q29uZmlnKElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBUeXBlIHR5cGUsIFN0cmluZyBwam5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9Nb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9Nb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkxMTc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRmlsdGVyLklGaWx0ZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklGaWx0ZXIuSUZpbHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldHNTZWxlY3Rpb25QYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCAKLQotICAgIGV4dGVuZHMgV2l6YXJkIAotICAgIAotewotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaXphcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgV2l6YXJkQ29udGV4dCgpOyAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvd0ZhY2V0c1NlbGVjdGlvblBhZ2U7Ci0gICAgcHJpdmF0ZSBGYWNldHNTZWxlY3Rpb25QYWdlIGZhY2V0c1NlbGVjdGlvblBhZ2U7Ci0gICAgcHJpdmF0ZSBGYWNldFBhZ2VzW10gZmFjZXRQYWdlcyA9IG5ldyBGYWNldFBhZ2VzWyAwIF07Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFnZUNvbnRhaW5lcjsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVdpemFyZFBhZ2U+IHBhZ2VzVG9EaXNwb3NlID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVubmFibGU+IGRlbGF5ZWRBY3Rpb25zOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxSdW5uYWJsZT4gb25EaXNwb3NlQWN0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGlzcG9zZVdvcmtpbmdDb3B5OwotICAgIAotICAgIHB1YmxpYyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCgpCi0gICAgewotICAgICAgICB0aGlzKCAoSUZhY2V0ZWRQcm9qZWN0KSBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIGZwcm9qID09IG51bGwKLSAgICAgICAgICAgICAgPyBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCkgCi0gICAgICAgICAgICAgIDogZnByb2ouY3JlYXRlV29ya2luZ0NvcHkoKSwgdHJ1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgKQotICAgIHsKLSAgICAJdGhpcyggZnBqd2MsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MsCi0gICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkaXNwb3NlV29ya2luZ0NvcHkgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZnBqd2MgPSBmcGp3YzsKLSAgICAgICAgICAgIHRoaXMuZGVsYXllZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFJ1bm5hYmxlPigpOwotICAgICAgICAgICAgdGhpcy5vbkRpc3Bvc2VBY3Rpb25zID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKLSAgICAgICAgICAgIHRoaXMuZGlzcG9zZVdvcmtpbmdDb3B5ID0gZGlzcG9zZVdvcmtpbmdDb3B5OwotICAgICAgICAgICAgdGhpcy5mYWNldHNTZWxlY3Rpb25QYWdlID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMuc2hvd0ZhY2V0c1NlbGVjdGlvblBhZ2UgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvciggdHJ1ZSApOwotICAgICAgICAgICAgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKCB0cnVlICk7Ci0gICAgICAgICAgICBzZXRXaW5kb3dUaXRsZSggUmVzb3VyY2VzLndpemFyZFRpdGxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFJ1bnRpbWVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZwandjOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICB0aGlzLmZwandjID0gZnBqd2M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoKQotICAgIHsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gdGhpcy5mcGp3Yy5nZXRGYWNldGVkUHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIGZwcm9qID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmZwandjLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwcm9qZWN0TmFtZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qIAotICAgICAgICAgICAgICAgICAgICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCggcHJvamVjdE5hbWUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmcHJvajsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RlZEZhY2V0c0NoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoIHJ1bm5hYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAJdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCApOwotICAgIAkKLSAgICAJdGhpcy5vbkRpc3Bvc2VBY3Rpb25zLmFkZAotICAgIAkoCi0gICAgCQluZXcgUnVubmFibGUoKQotICAgIAkJewotICAgIAkJCXB1YmxpYyB2b2lkIHJ1bigpCi0gICAgCQkJewotICAgIAkJCQlNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZC50aGlzLmZwandjLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBnZXRTaG93RmFjZXRzU2VsZWN0aW9uUGFnZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWNldHNTZWxlY3Rpb25QYWdlID0gbmV3IEZhY2V0c1NlbGVjdGlvblBhZ2UoIGdldEJhc2VGYWNldHMoKSwgdGhpcy5mcGp3YyApOwotICAgICAgICAgICAgYWRkUGFnZSggdGhpcy5mYWNldHNTZWxlY3Rpb25QYWdlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRQYWdlQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBhZ2VzKCkubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldFBhZ2VzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SVdpemFyZFBhZ2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFnZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdC5hZGQoIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFnZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHRoaXMuZmFjZXRQYWdlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKCB0aGlzLmZhY2V0UGFnZXNbIGkgXS5wYWdlcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KCBuZXcgSVdpemFyZFBhZ2VbIGxpc3Quc2l6ZSgpIF0gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFBhZ2UoIGZpbmFsIFN0cmluZyBwYWdlTmFtZSApCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXNbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHBhZ2UuZ2V0TmFtZSgpLmVxdWFscyggcGFnZU5hbWUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQYWdlcygpWyAwIF07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggZmluYWwgSVdpemFyZFBhZ2UgcGFnZSApCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGludCBwb3MgPSAtMTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcGFnZXNbIGkgXSA9PSBwYWdlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggcG9zID09IHBhZ2VzLmxlbmd0aCAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYWdlc1sgcG9zICsgMSBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSggZmluYWwgSVdpemFyZFBhZ2UgcGFnZSApCi0gICAgewotICAgICAgICBmaW5hbCBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGludCBwb3MgPSAtMTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcGFnZXNbIGkgXSA9PSBwYWdlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggcG9zID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYWdlc1sgcG9zIC0gMSBdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gICAgewotICAgICAgICBpZiggdGhpcy5mYWNldHNTZWxlY3Rpb25QYWdlICE9IG51bGwgJiYgISB0aGlzLmZhY2V0c1NlbGVjdGlvblBhZ2UuaXNQYWdlQ29tcGxldGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgcGFnZXNbIGkgXS5pc1BhZ2VDb21wbGV0ZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoIGZpbmFsIENvbXBvc2l0ZSBjb250YWluZXIgKQotICAgIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKCBjb250YWluZXIgKTsKLSAgICAgICAgdGhpcy5wYWdlQ29udGFpbmVyID0gY29udGFpbmVyOwotICAgICAgICBoYW5kbGVTZWxlY3RlZEZhY2V0c0NoYW5nZWRFdmVudCgpOwotICAgICAgICBleGVjdXRlRGVsYXllZEFjdGlvbnMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIAotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0aGlzLmZhY2V0UGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElGYWNldFdpemFyZFBhZ2UgZnAgOiB0aGlzLmZhY2V0UGFnZXNbIGkgXS5wYWdlcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnAudHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSB3ciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtRmluaXNoKCBtb25pdG9yICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKCB0cnVlLCBmYWxzZSwgb3AgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApIAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUgKSAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHRlID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSVN0YXR1cyBzdCA9ICggKENvcmVFeGNlcHRpb24pIHRlICkuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHN0LmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgIGlmKCAhICggdGUgaW5zdGFuY2VvZiBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbiApIHx8Ci0gICAgICAgICAgICAgICAgICAgICEgKCAoRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb24pIHRlICkuaXNFeHBlY3RlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBzdCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBzdC5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2F1c2UgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ID0gKCAoQ29yZUV4Y2VwdGlvbikgY2F1c2UgKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoIGdldFNoZWxsKCksIFJlc291cmNlcy5lcnJEbGdUaXRsZSwgbXNnLCBzdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldFRhcmdldEV4Y2VwdGlvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1GaW5pc2goIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGp3Yy5jb21taXRDaGFuZ2VzKCBtb25pdG9yICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN5bmNXaXRoUHJlc2V0c01vZGVsKCBmaW5hbCBDb21ibyBjb21ibyApCi0gICAgewotICAgICAgICBzeW5jV2l0aFByZXNldHNNb2RlbCggdGhpcy5mcGp3YywgY29tYm8gKTsKLSAgICB9Ci0JCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN5bmNXaXRoUHJlc2V0c01vZGVsKCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbWJvIGNvbWJvICkKLSAgICB7Ci0gICAgICAgIHN5bmNXaXRoUHJlc2V0c01vZGVsKCBmcGp3YywgY29tYm8sIG51bGwgKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyB2b2lkIHN5bmNXaXRoUHJlc2V0c01vZGVsKCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbWJvIGNvbWJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbHRlcjxJUHJlc2V0PiBmaWx0ZXIgKQotCXsKLSAgICAgICAgZmluYWwgTGlzdDxJUHJlc2V0PiBzb3J0ZWRQcmVzZXRzID0gbmV3IEFycmF5TGlzdDxJUHJlc2V0PigpOwotICAgICAgICAKLSAgICAgICAgLy8gQ29udGVudHMgOiBtb2RlbCAtPiB2aWV3Ci0KLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgYXZhaWxhYmxlUHJlc2V0c0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbWJvLmlzRGlzcG9zZWQoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHNvcnRlZFByZXNldHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFByZXNldHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmlsdGVyICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IGZwandjLmdldEF2YWlsYWJsZVByZXNldHMoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaWx0ZXIuY2hlY2soIHByZXNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRQcmVzZXRzLmFkZCggcHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkUHJlc2V0cy5hZGRBbGwoIGZwandjLmdldEF2YWlsYWJsZVByZXNldHMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRQcmVzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcGFyYXRvcjxJUHJlc2V0PigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggZmluYWwgSVByZXNldCBwMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcmVzZXQgcDIgKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcDEgPT0gcDIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwMS5nZXRMYWJlbCgpLmNvbXBhcmVUbyggcDIuZ2V0TGFiZWwoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByZXNldCBzZWxlY3RlZFByZXNldCA9IGZwandjLmdldFNlbGVjdGVkUHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm8uYWRkKCBSZXNvdXJjZXMuY3VzdG9tUHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNlbGVjdGVkUHJlc2V0ID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm8uc2VsZWN0KCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSVByZXNldCBwcmVzZXQgOiBzb3J0ZWRQcmVzZXRzICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvLmFkZCggcHJlc2V0LmdldExhYmVsKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzZWxlY3RlZFByZXNldCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0LmdldElkKCkuZXF1YWxzKCBzZWxlY3RlZFByZXNldC5nZXRJZCgpICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iby5zZWxlY3QoIGNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoIHJ1bm5hYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBmcGp3Yy5hZGRMaXN0ZW5lciggYXZhaWxhYmxlUHJlc2V0c0NoYW5nZWRMaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkFWQUlMQUJMRV9QUkVTRVRTX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmaWx0ZXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbHRlci5hZGRMaXN0ZW5lcgotICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgIG5ldyBJRmlsdGVyTGlzdGVuZXI8SVByZXNldD4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGaWx0ZXJFdmVudDxJUHJlc2V0PiBldmVudCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVByZXNldHNDaGFuZ2VkTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgSUZpbHRlckV2ZW50LlR5cGUuRklMVEVSX0NIQU5HRUQgCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBzZWxlY3RlZFByZXNldENoYW5nZWRMaXN0ZW5lciA9IG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKCBzb3J0ZWRQcmVzZXRzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IGZwandjLmdldFNlbGVjdGVkUHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcmVzZXQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHNvcnRlZFByZXNldHMuaW5kZXhPZiggcHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvLnNlbGVjdCggaW5kZXggKyAxICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggcnVubmFibGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZwandjLmFkZExpc3RlbmVyKCBzZWxlY3RlZFByZXNldENoYW5nZWRMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuU0VMRUNURURfUFJFU0VUX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNlbGVjdGlvbiA6IHZpZXcgLT4gbW9kZWwKLSAgICAgICAgCi0gICAgICAgIGNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHNvcnRlZFByZXNldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVzZXRJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNlbGVjdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXRJZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0SWQgPSBzb3J0ZWRQcmVzZXRzLmdldCggc2VsZWN0aW9uIC0gMSApLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBwcmVzZXRJZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gVHJpZ2dlciBpbml0aWFsIFVJIHBvcHVsYXRpb24uCi0gICAgICAgIAotICAgICAgICBhdmFpbGFibGVQcmVzZXRzQ2hhbmdlZExpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIHdvcmtpbmcgY29weSBsaXN0ZW5lcnMgd2hlbiB0aGUgd2lkZ2V0IGlzIGRpc3Bvc2VkLgotICAgICAgICAKLSAgICAgICAgY29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBEaXNwb3NlTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKCBmaW5hbCBEaXNwb3NlRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnBqd2MucmVtb3ZlTGlzdGVuZXIoIGF2YWlsYWJsZVByZXNldHNDaGFuZ2VkTGlzdGVuZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgZnBqd2MucmVtb3ZlTGlzdGVuZXIoIHNlbGVjdGVkUHJlc2V0Q2hhbmdlZExpc3RlbmVyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUV4cGFuZGVkU3RhdGUoIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhwYW5kZWQgKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFnZSAhPSBudWxsICYmIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFnZS5wYW5lbCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWNldHNTZWxlY3Rpb25QYWdlLnBhbmVsLnNldENhdGVnb3J5RXhwYW5kZWRTdGF0ZSggY2F0ZWdvcnksIHRydWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENhdGVnb3J5RXhwYW5kZWRTdGF0ZSggY2F0ZWdvcnksIGV4cGFuZGVkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5kZWxheWVkQWN0aW9ucy5hZGQoIGFjdGlvbiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldFNob3dGYWNldHNTZWxlY3Rpb25QYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNob3dGYWNldHNTZWxlY3Rpb25QYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTaG93RmFjZXRzU2VsZWN0aW9uUGFnZSggZmluYWwgYm9vbGVhbiBzaG93RmFjZXRzU2VsZWN0aW9uUGFnZSApCi0gICAgewotICAgICAgICB0aGlzLnNob3dGYWNldHNTZWxlY3Rpb25QYWdlID0gc2hvd0ZhY2V0c1NlbGVjdGlvblBhZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0aGlzLmZhY2V0UGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VzVG9EaXNwb3NlLmFkZEFsbCggdGhpcy5mYWNldFBhZ2VzWyBpIF0ucGFnZXMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJV2l6YXJkUGFnZSBwYWdlIDogdGhpcy5wYWdlc1RvRGlzcG9zZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhZ2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFJ1bm5hYmxlIG9uRGlzcG9zZUFjdGlvbiA6IHRoaXMub25EaXNwb3NlQWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCW9uRGlzcG9zZUFjdGlvbi5ydW4oKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIAl7Ci0gICAgICAgIAkJRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuZGlzcG9zZVdvcmtpbmdDb3B5ICkKLSAgICAgICAgewotICAgICAgICAJdGhpcy5mcGp3Yy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmFjZXRQYWdlcwotICAgIHsKLSAgICAgICAgcHVibGljIEFjdGlvbiBhY3Rpb247Ci0gICAgICAgIHB1YmxpYyBMaXN0PElGYWNldFdpemFyZFBhZ2U+IHBhZ2VzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0ZWRGYWNldHNDaGFuZ2VkRXZlbnQoKQotICAgIHsKLSAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgdmFsaWRhdGlvbiBlcnJvcnMuCi0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5mcGp3Yy52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIHNldCBvZiBhY3Rpb25zIGFuZCBzb3J0IHRoZW0uCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UgPSBnZXRCYXNlRmFjZXRzKCk7Ci0gICAgICAgIGZpbmFsIFNldDxBY3Rpb24+IGFjdGlvbnMgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpOwotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gc29ydGVkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPiggYWN0aW9ucyApOwotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCBiYXNlLCBzb3J0ZWRBY3Rpb25zICk7Ci0gICAgICAgIAotICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgc2VxdWVuY2Ugb2Ygd2l6YXJkIHBhZ2VzLgotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxGYWNldFBhZ2VzPiBuZXdGYWNldFBhZ2VzID0gbmV3IEFycmF5TGlzdDxGYWNldFBhZ2VzPigpOwotICAgICAgICBmaW5hbCBib29sZWFuW10gbWFya2VycyA9IG5ldyBib29sZWFuWyB0aGlzLmZhY2V0UGFnZXMubGVuZ3RoIF07Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogc29ydGVkQWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgIEZhY2V0UGFnZXMgZnAgPSBmaW5kRmFjZXRQYWdlcyggYWN0aW9uLCBtYXJrZXJzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmcCA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBhY3Rpb25kZWY7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb25kZWYgPSBmdi5nZXRBY3Rpb25EZWZpbml0aW9uKCBiYXNlLCBhY3Rpb24uZ2V0VHlwZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SUZhY2V0V2l6YXJkUGFnZT4gcGFnZXMKLSAgICAgICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VyLmdldFdpemFyZFBhZ2VzKCBhY3Rpb25kZWYuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIHBhZ2VzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcCA9IG5ldyBGYWNldFBhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZwLmFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgZnAucGFnZXMgPSBwYWdlczsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSUZhY2V0V2l6YXJkUGFnZSBwYWdlIDogZnAucGFnZXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLnNldFdpemFyZCggdGhpcyApOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5zZXRXaXphcmRDb250ZXh0KCB0aGlzLmNvbnRleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2V0Q29uZmlnKCBhY3Rpb24uZ2V0Q29uZmlnKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2woIHRoaXMucGFnZUNvbnRhaW5lciApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZwICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0ZhY2V0UGFnZXMuYWRkKCBmcCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHRoaXMuZmFjZXRQYWdlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIG1hcmtlcnNbIGkgXSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJRmFjZXRXaXphcmRQYWdlIHBhZ2UgOiB0aGlzLmZhY2V0UGFnZXNbIGkgXS5wYWdlcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYWdlLnNldFdpemFyZCggbnVsbCApOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzVG9EaXNwb3NlLmFkZCggcGFnZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGNoYW5nZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0UGFnZXMgPSBuZXcgRmFjZXRQYWdlc1sgbmV3RmFjZXRQYWdlcy5zaXplKCkgXTsKLSAgICAgICAgICAgIG5ld0ZhY2V0UGFnZXMudG9BcnJheSggdGhpcy5mYWNldFBhZ2VzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMucGFnZUNvbnRhaW5lci5sYXlvdXQoIHRydWUsIHRydWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHdpemFyZENvbnRhaW5lci5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdpemFyZENvbnRhaW5lci51cGRhdGVCdXR0b25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYWNldFBhZ2VzIGZpbmRGYWNldFBhZ2VzKCBmaW5hbCBBY3Rpb24gYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbltdIG1hcmtlcnMgKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0aGlzLmZhY2V0UGFnZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGYWNldFBhZ2VzIGZwID0gdGhpcy5mYWNldFBhZ2VzWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmcC5hY3Rpb24gPT0gYWN0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJzWyBpIF0gPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBmcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRCYXNlRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IHRoaXMuZnBqd2MuZ2V0RmFjZXRlZFByb2plY3QoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmcHJvaiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRGVsYXllZEFjdGlvbnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBSdW5uYWJsZSByIDogdGhpcy5kZWxheWVkQWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgV2l6YXJkQ29udGV4dAotCi0gICAgICAgIGltcGxlbWVudHMgSVdpemFyZENvbnRleHQKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RGYWNldFNlbGVjdGVkKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RlZFByb2plY3RGYWNldHMoKS5jb250YWlucyggZnYgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8QWN0aW9uPiBnZXRBY3Rpb25zKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5nZXRQcm9qZWN0RmFjZXRBY3Rpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQWN0aW9uIGdldEFjdGlvbiggZmluYWwgQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBnZXRBY3Rpb25zKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IHR5cGUgJiYgYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKSA9PSBmICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb25maWcoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBqbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb24oIHR5cGUsIGZ2ICk7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uICE9IG51bGwgPyBhY3Rpb24uZ2V0Q29uZmlnKCkgOiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpemFyZFRpdGxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJEbGdUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tUHJlc2V0OwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL01vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL01vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTExNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9Nb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi13aXphcmRUaXRsZSA9IE1vZGlmeSBGYWNldGVkIFByb2plY3QKLWVyckRsZ1RpdGxlID0gRXJyb3IKLWN1c3RvbVByZXNldCA9IDxjdXN0b20+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL1ByZXNldFNlbGVjdGlvblBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL1ByZXNldFNlbGVjdGlvblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYmU0NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9QcmVzZXRTZWxlY3Rpb25QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhzcGFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldHNTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByZXNldFNlbGVjdGlvblBhbmVsCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZQotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgR3JvdXAgZ3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21ibyBwcmVzZXRzQ29tYm87Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdXR0b24gbW9kaWZ5QnV0dG9uOwotICAgIHByaXZhdGUgZmluYWwgVGV4dCBkZXNjVGV4dEZpZWxkOwotICAgIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0gICAgCi0gICAgcHVibGljIFByZXNldFNlbGVjdGlvblBhbmVsKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgKQotICAgIHsKLSAgICAgICAgdGhpcyggcGFyZW50LCBmcGp3YywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBQcmVzZXRTZWxlY3Rpb25QYW5lbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbHRlcjxJUHJlc2V0PiBmaWx0ZXIgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgCi0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoIHBhcmVudCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGp3YyA9IGZwandjOwotICAgICAgICAKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCggMSwgZmFsc2UgKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIAotICAgICAgICBzZXRMYXlvdXQoIGxheW91dCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5ncm91cCA9IG5ldyBHcm91cCggdGhpcywgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5ncm91cC5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCAyLCBmYWxzZSApICk7Ci0gICAgICAgIHRoaXMuZ3JvdXAuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIHRoaXMuZ3JvdXAuc2V0VGV4dCggUmVzb3VyY2VzLmdyb3VwVGl0bGUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucHJlc2V0c0NvbWJvID0gbmV3IENvbWJvKCB0aGlzLmdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgICAgICB0aGlzLnByZXNldHNDb21iby5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubW9kaWZ5QnV0dG9uID0gbmV3IEJ1dHRvbiggdGhpcy5ncm91cCwgU1dULlBVU0ggKTsKLSAgICAgICAgdGhpcy5tb2RpZnlCdXR0b24uc2V0VGV4dCggUmVzb3VyY2VzLm1vZGlmeUJ1dHRvbkxhYmVsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1vZGlmeUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vZGlmeUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlc2NUZXh0RmllbGQgPSBuZXcgVGV4dCggdGhpcy5ncm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQICk7Ci0gICAKLSAgICAgICAgZmluYWwgR3JpZERhdGEgZ2QgPSBnZGhzcGFuKCBnZGhmaWxsKCksIDIgKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgICAgICBnZC5taW5pbXVtSGVpZ2h0ID0gMzA7Ci0gICAgICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZGVzY1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKCBnZCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lcgotICAgICAgICAoIAotICAgICAgICAgICAgbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBydW5uYWJsZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlNFTEVDVEVEX1BSRVNFVF9DSEFOR0VECi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZC5zeW5jV2l0aFByZXNldHNNb2RlbCggdGhpcy5mcGp3YywgdGhpcy5wcmVzZXRzQ29tYm8sIGZpbHRlciApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gdGhpcy5mcGp3Yy5nZXRTZWxlY3RlZFByZXNldCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlc2M7Ci0gICAgICAgIAotICAgICAgICBpZiggcHJlc2V0ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXNjID0gUmVzb3VyY2VzLmhpbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXNjID0gcHJlc2V0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZGVzY1RleHRGaWVsZC5zZXRUZXh0KCBkZXNjICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBpbnQgY3VycmVudEhlaWdodCA9IHRoaXMuZGVzY1RleHRGaWVsZC5nZXRTaXplKCkueTs7Ci0gICAgICAgICggKEdyaWREYXRhKSB0aGlzLmRlc2NUZXh0RmllbGQuZ2V0TGF5b3V0RGF0YSgpICkubWluaW11bUhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7Ci0KLSAgICAgICAgZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgICAgICBzaGVsbC5sYXlvdXQoIHRydWUsIHRydWUgKTsKLSAgICAgICAgZmluYWwgUG9pbnQgY3VycmVudFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgIGZpbmFsIFBvaW50IHByZWZlcnJlZFNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSggY3VycmVudFNpemUueCAtIDMwLCBTV1QuREVGQVVMVCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHByZWZlcnJlZFNpemUueSA+IGN1cnJlbnRTaXplLnkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGVsbC5zZXRTaXplKCBjdXJyZW50U2l6ZS54LCBwcmVmZXJyZWRTaXplLnkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZ5QnV0dG9uUHJlc3NlZCgpCi0gICAgewotICAgICAgICBGYWNldHNTZWxlY3Rpb25EaWFsb2cub3BlbkRpYWxvZyggZ2V0U2hlbGwoKSwgdGhpcy5mcGp3YyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cFRpdGxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoaW50OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlCdXR0b25MYWJlbDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFByZXNldFNlbGVjdGlvblBhbmVsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9QcmVzZXRTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9QcmVzZXRTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjNlZDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvUHJlc2V0U2VsZWN0aW9uUGFuZWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZ3JvdXBUaXRsZSA9IENvbmZpZ3VyYXRpb24KLWhpbnQgPSBIaW50OiBHZXQgc3RhcnRlZCBxdWlja2x5IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIHByZS1kZWZpbmVkIHByb2plY3QgY29uZmlndXJhdGlvbnMuCi1tb2RpZnlCdXR0b25MYWJlbCA9IE1vZGlmeS4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9Qcm9qZWN0RmFjZXRzVWlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL1Byb2plY3RGYWNldHNVaU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYmVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL1Byb2plY3RGYWNldHNVaU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RGYWNldHNVaU1hbmFnZXIgCi17Ci0gICAgcHJpdmF0ZSBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VyKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8SUZhY2V0V2l6YXJkUGFnZT4gZ2V0V2l6YXJkUGFnZXMoIGZpbmFsIFN0cmluZyBhY3Rpb25JZCApCi0gICAgewotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwuZ2V0V2l6YXJkUGFnZXMoIGFjdGlvbklkICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUZhY2V0V2l6YXJkUGFnZX0pCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0V2l6YXJkUGFnZXMoIGZpbmFsIEFjdGlvbi5UeXBlIGFjdGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VySW1wbC5nZXRXaXphcmRQYWdlcyggYWN0aW9uVHlwZSwgZiApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9DYXRlZ29yeURldGFpbHNQYW5lbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9DYXRlZ29yeURldGFpbHNQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFkMmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvQ2F0ZWdvcnlEZXRhaWxzUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbG1hcmdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5JbWFnZVdpdGhUZXh0Q29tcG9zaXRlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRlZ29yeURldGFpbHNQYW5lbAotCi0gICAgZXh0ZW5kcyBDb21wb3NpdGUKLQotewotICAgIHB1YmxpYyBDYXRlZ29yeURldGFpbHNQYW5lbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZhY2V0c1NlbGVjdGlvblBhbmVsIGZhY2V0c1NlbGVjdGlvblBhbmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNhdGVnb3J5IGNhdGVnb3J5ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIAotICAgICAgICBzZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApICk7Ci0KLSAgICAgICAgZmluYWwgSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZSBoZWFkZXIgPSBuZXcgSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZSggdGhpcyApOwotICAgICAgICBoZWFkZXIuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGhlYWRlci5zZXRJbWFnZSggZmFjZXRzU2VsZWN0aW9uUGFuZWwuZ2V0SW1hZ2UoIGNhdGVnb3J5ICkgKTsKLSAgICAgICAgaGVhZGVyLnNldEZvbnQoIGdldEZvbnRSZWdpc3RyeSgpLmdldCggRGV0YWlsc1BhbmVsLkhFQURFUl9GT05UICkgKTsKLSAgICAgICAgaGVhZGVyLnNldFRleHQoIGNhdGVnb3J5LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbCggdGhpcywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMICk7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLQotICAgICAgICBmaW5hbCBUZXh0IGRlc2NUZXh0RmllbGQgPSBuZXcgVGV4dCggdGhpcywgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIGRlc2NUZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGRlc2NUZXh0RmllbGQuc2V0VGV4dCggY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICAvL2Rlc2NUZXh0RmllbGQuc2V0QmFja2dyb3VuZCggZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvQ2hhbmdlRmFjZXRWZXJzaW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0NoYW5nZUZhY2V0VmVyc2lvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY0MTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvQ2hhbmdlRmFjZXRWZXJzaW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaHNwYW47Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkdmluZGVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2R3aGludDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2w7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsbWFyZ2luczsKLQotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENoYW5nZUZhY2V0VmVyc2lvbkRpYWxvZwotCi0gICAgZXh0ZW5kcyBEaWFsb2cKLSAgICAKLXsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGRWZXJzaW9uOwotCXByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gbmV3VmVyc2lvbjsKLQlwcml2YXRlIGZpbmFsIFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYXZhaWxhYmxlVmVyc2lvbnM7Ci0JcHJpdmF0ZSBDb21ibyB2ZXJzaW9uQ29tYm87Ci0gICAgCi0gICAgcHJpdmF0ZSBDaGFuZ2VGYWNldFZlcnNpb25EaWFsb2coIGZpbmFsIFNoZWxsIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBjdXJyZW50VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhdmFpbGFibGVWZXJzaW9ucyApCi0gICAgewotICAgICAgICBzdXBlciggc2hlbGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgICAgICAgdGhpcy5vbGRWZXJzaW9uID0gY3VycmVudFZlcnNpb247Ci0gICAgICAgIHRoaXMubmV3VmVyc2lvbiA9IGN1cnJlbnRWZXJzaW9uOwotICAgICAgICB0aGlzLmF2YWlsYWJsZVZlcnNpb25zID0gYXZhaWxhYmxlVmVyc2lvbnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gc2hvd0RpYWxvZyggZmluYWwgU2hlbGwgc2hlbGwsCi0gICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0LAotICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gY3VycmVudFZlcnNpb24sCi0gICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGF2YWlsYWJsZVZlcnNpb25zICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIENoYW5nZUZhY2V0VmVyc2lvbkRpYWxvZyBkaWFsb2cgCi0gICAgICAgIAk9IG5ldyBDaGFuZ2VGYWNldFZlcnNpb25EaWFsb2coIHNoZWxsLCBmYWNldCwgY3VycmVudFZlcnNpb24sIGF2YWlsYWJsZVZlcnNpb25zICk7Ci0gICAgICAgIAotICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBzZWxlY3RlZFZlcnNpb24gPSBudWxsOwotCi0gICAgICAgIGlmKCBkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQgKQotICAgICAgICB7Ci0gICAgICAgIAlzZWxlY3RlZFZlcnNpb24gPSBkaWFsb2cubmV3VmVyc2lvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbCggZmluYWwgU2hlbGwgc2hlbGwgKQotICAgIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoIHNoZWxsICk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIFJlc291cmNlcy5kaWFsb2dUaXRsZSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDIgKSwgNSwgNSwgNSwgMTAgKSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ2R3aGludCggZ2RmaWxsKCksIDMwMCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMYWJlbCBwcm9tcHRMYWJlbCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuV1JBUCApOwotICAgICAgICBwcm9tcHRMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhzcGFuKCBnZGhmaWxsKCksIDIgKSApOwotICAgICAgICBwcm9tcHRMYWJlbC5zZXRUZXh0KCBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmRpYWxvZ1Byb21wdCwgdGhpcy5mYWNldC5nZXRMYWJlbCgpICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExhYmVsIHZlcnNpb25GaWVsZExhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIHZlcnNpb25GaWVsZExhYmVsLnNldExheW91dERhdGEoIGdkdmluZGVudCggZ2QoKSwgOCApICk7Ci0gICAgICAgIHZlcnNpb25GaWVsZExhYmVsLnNldFRleHQoIFJlc291cmNlcy52ZXJzaW9uRmllbGRMYWJlbCApOwotCi0gICAgICAgIHRoaXMudmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKCBjb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIHRoaXMudmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoIGdkdmluZGVudCggZ2QoKSwgOCApICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5hdmFpbGFibGVWZXJzaW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgCXRoaXMudmVyc2lvbkNvbWJvLmFkZCggZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmKCBmdiA9PSB0aGlzLm9sZFZlcnNpb24gKQotICAgICAgICAJewotICAgICAgICAJCXRoaXMudmVyc2lvbkNvbWJvLnNlbGVjdCggdGhpcy52ZXJzaW9uQ29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxICk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMudmVyc2lvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKSAKLSAgICAgICAgCQl7Ci0gICAgICAgIAkJCWhhbmRsZVZlcnNpb25TZWxlY3RlZCgpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVWZXJzaW9uU2VsZWN0ZWQoKQotICAgIHsKLSAgICAJZmluYWwgaW50IGluZGV4ID0gdGhpcy52ZXJzaW9uQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAJCi0gICAgCWludCBpID0gMDsKLSAgICAJCi0gICAgCWZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmF2YWlsYWJsZVZlcnNpb25zICkKLSAgICAJewotICAgIAkJaWYoIGkgPT0gaW5kZXggKQotICAgIAkJewotICAgIAkJCXRoaXMubmV3VmVyc2lvbiA9IGZ2OwotICAgIAkJfQotICAgIAkJCi0gICAgCQlpKys7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Byb21wdDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkZpZWxkTGFiZWw7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBDaGFuZ2VGYWNldFZlcnNpb25EaWFsb2cuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0NoYW5nZUZhY2V0VmVyc2lvbkRpYWxvZy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9DaGFuZ2VGYWNldFZlcnNpb25EaWFsb2cucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjNDQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0NoYW5nZUZhY2V0VmVyc2lvbkRpYWxvZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1kaWFsb2dUaXRsZSA9IENoYW5nZSBWZXJzaW9uCi1kaWFsb2dQcm9tcHQgPSBTZWxlY3QgbmV3IHZlcnNpb24gZm9yIHRoZSB7MH0gZmFjZXQuCi12ZXJzaW9uRmllbGRMYWJlbCA9IFZlcnNpb246CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0NvbnN0cmFpbnREaXNwbGF5RGlhbG9nLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0NvbnN0cmFpbnREaXNwbGF5RGlhbG9nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTE0OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9Db25zdHJhaW50RGlzcGxheURpYWxvZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wcmVzc0VzY1RvQ2xvc2UgPSBQcmVzcyAnRXNjJyB0byBjbG9zZS4KLWFuZE9wZXJhdG9yID0gQU5ECi1vck9wZXJhdG9yID0gT1IKLXJlcXVpcmVzRmFjZXRPcGVyYXRvciA9IFwgcmVxdWlyZXMgZmFjZXRcIAotcmVxdWlyZXNHcm91cE1lbWJlck9wZXJhdG9yID0gXCByZXF1aXJlcyBncm91cCBtZW1iZXJcIAotY29uZmxpY3RzV2l0aEdyb3VwT3BlcmF0b3IgPSBcIGNvbmZsaWN0cyB3aXRoIGdyb3VwXCAKLWNvbmZsaWN0c1dpdGhGYWNldE9wZXJhdG9yID0gXCBjb25mbGljdHMgd2l0aCBmYWNldFwgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0RlY29yYXRpb25zUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRGVjb3JhdGlvbnNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVkMTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRGVjb3JhdGlvbnNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklEZWNvcmF0aW9uc1Byb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWNvcmF0aW9uc1Byb3ZpZGVyCi0KLSAgICBpbXBsZW1lbnRzIElEZWNvcmF0aW9uc1Byb3ZpZGVyCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgYWRhcHRhYmxlOwotICAgIAotICAgIHB1YmxpYyBEZWNvcmF0aW9uc1Byb3ZpZGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYWRhcHRhYmxlID0gYWRhcHRhYmxlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNVaU1hbmFnZXJJbXBsLmdldEljb24oIHRoaXMuYWRhcHRhYmxlICk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElEZWNvcmF0aW9uc1Byb3ZpZGVyLmNsYXNzIH07Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IElEZWNvcmF0aW9uc1Byb3ZpZGVyLmNsYXNzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb25zUHJvdmlkZXIoIGFkYXB0YWJsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0RldGFpbHNQYW5lbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9EZXRhaWxzUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxZWZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0RldGFpbHNQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbG1hcmdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXRhaWxzUGFuZWwKLQotICAgIGV4dGVuZHMgQ29tcG9zaXRlCi0KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRk9OVCAKLSAgICAgICAgPSBEZXRhaWxzUGFuZWwuY2xhc3MuZ2V0TmFtZSgpICsgIi5IRUFERVJfRk9OVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0Rm9udE5hbWUgPSBnZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKClbIDAgXS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIEZvbnREYXRhW10gZm9udERhdGEgPSBnZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKCBkZWZhdWx0Rm9udE5hbWUgKS5nZXRGb250RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgZ2V0Rm9udFJlZ2lzdHJ5KCkucHV0KCBIRUFERVJfRk9OVCwgZm9udERhdGEgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZhY2V0c1NlbGVjdGlvblBhbmVsIGZhY2V0c1NlbGVjdGlvblBhbmVsOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNvbnRlbnQgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBEZXRhaWxzUGFuZWwoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmFjZXRzU2VsZWN0aW9uUGFuZWwgZmFjZXRzU2VsZWN0aW9uUGFuZWwgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgCi0gICAgICAgIHNldExheW91dCggZ2xtYXJnaW5zKCBnbCggMSApLCA1LCA4ICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFuZWwgPSBmYWNldHNTZWxlY3Rpb25QYW5lbDsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFuZWwuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFuZWwuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkZJWEVEX0ZBQ0VUU19DSEFOR0VECi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmNvbnRlbnQgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29udGVudC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5mYWNldHNTZWxlY3Rpb25QYW5lbC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzZWwgPT0gbnVsbCB8fCBzZWwuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IENvbXBvc2l0ZSggdGhpcywgU1dULk5PTkUgKTsKLSAgICAgICAgICAgIHRoaXMuY29udGVudC5zZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFRleHQgbm9TZWxlY3Rpb25UZXh0RmllbGQgPSBuZXcgVGV4dCggdGhpcy5jb250ZW50LCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgICAgIG5vU2VsZWN0aW9uVGV4dEZpZWxkLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICAgICAgbm9TZWxlY3Rpb25UZXh0RmllbGQuc2V0VGV4dCggUmVzb3VyY2VzLm5vU2VsZWN0aW9uTGFiZWwgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBzZWxlY3Rpb24gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmKCBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0VmVyc2lvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgRmFjZXREZXRhaWxzUGFuZWwoIHRoaXMsIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFuZWwsIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQ2F0ZWdvcnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXQgPSAoSUNhdGVnb3J5KSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IENhdGVnb3J5RGV0YWlsc1BhbmVsKCB0aGlzLCB0aGlzLmZhY2V0c1NlbGVjdGlvblBhbmVsLCBjYXQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29udGVudC5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICAKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vU2VsZWN0aW9uTGFiZWw7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBEZXRhaWxzUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0RldGFpbHNQYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9EZXRhaWxzUGFuZWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyNzA5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0RldGFpbHNQYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbm9TZWxlY3Rpb25MYWJlbCA9IFNlbGVjdCBhIHByb2plY3QgZmFjZXQgb24gdGhlIGxlZnQgdG8gdmlldyBpbmZvcm1hdGlvbiBhYm91dCBpdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXREZXRhaWxzUGFuZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXREZXRhaWxzUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwNTFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0RGV0YWlsc1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhpbmRlbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkdmluZGVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2w7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsbWFyZ2luczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2xzcGFjaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLlByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5Qcm9qZWN0RmFjZXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLmNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuY29uc3RyYWludHMuQ29uc3RyYWludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLmNvbnN0cmFpbnRzLkdyb3VwaW5nQ29uc3RyYWludE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5jb25zdHJhaW50cy5NdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkltYWdlV2l0aFRleHRDb21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0RGV0YWlsc1BhbmVsCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZQotCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQcm9qZWN0RmFjZXRSZWY+IEZBQ0VUX1JFRl9DT01QQVJBVE9SIAotICAgICAgICA9IG5ldyBDb21wYXJhdG9yPFByb2plY3RGYWNldFJlZj4oKQotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKCBmaW5hbCBQcm9qZWN0RmFjZXRSZWYgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXRSZWYgeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB4TGFiZWwgPSB4LmdldFByb2plY3RGYWNldCgpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgeUxhYmVsID0geS5nZXRQcm9qZWN0RmFjZXQoKS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4geExhYmVsLmNvbXBhcmVUbyggeUxhYmVsICk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBGYWNldHNTZWxlY3Rpb25QYW5lbCBmYWNldHNTZWxlY3Rpb25QYW5lbDsKLSAgICAKLSAgICBwdWJsaWMgRmFjZXREZXRhaWxzUGFuZWwoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGYWNldHNTZWxlY3Rpb25QYW5lbCBmYWNldHNTZWxlY3Rpb25QYW5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZhY2V0c1NlbGVjdGlvblBhbmVsID0gZmFjZXRzU2VsZWN0aW9uUGFuZWw7Ci0gICAgICAgIAotICAgICAgICBzZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyAKLSAgICAgICAgICAgID0gZmFjZXRzU2VsZWN0aW9uUGFuZWwuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZSBoZWFkZXIgPSBuZXcgSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZSggdGhpcyApOwotICAgICAgICBoZWFkZXIuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGhlYWRlci5zZXRJbWFnZSggZmFjZXRzU2VsZWN0aW9uUGFuZWwuZ2V0SW1hZ2UoIGZhY2V0LmdldFByb2plY3RGYWNldCgpLCBmYWxzZSApICk7Ci0gICAgICAgIGhlYWRlci5zZXRGb250KCBnZXRGb250UmVnaXN0cnkoKS5nZXQoIERldGFpbHNQYW5lbC5IRUFERVJfRk9OVCApICk7Ci0gICAgICAgIGhlYWRlci5zZXRUZXh0KCBmYWNldC50b1N0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoIHRoaXMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCApOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBkZXRhaWxzID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKCB0aGlzLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgKTsKLSAgICAgICAgZGV0YWlscy5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICBkZXRhaWxzLnNldE1pbldpZHRoKCAzMDAgKTsKLSAgICAgICAgZGV0YWlscy5zZXRFeHBhbmRIb3Jpem9udGFsKCB0cnVlICk7Ci0gICAgICAgIGRldGFpbHMuc2V0RXhwYW5kVmVydGljYWwoIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBuZXN0ZWREZXRhaWxzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggZGV0YWlscywgU1dULk5PTkUgKTsKLSAgICAgICAgbmVzdGVkRGV0YWlsc0NvbXBvc2l0ZS5zZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMTAsIDAsIDAgKSApOwotICAgICAgICBkZXRhaWxzLnNldENvbnRlbnQoIG5lc3RlZERldGFpbHNDb21wb3NpdGUgKTsKLQotICAgICAgICBmaW5hbCBUZXh0IGRlc2NUZXh0RmllbGQgPSBuZXcgVGV4dCggbmVzdGVkRGV0YWlsc0NvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIGRlc2NUZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGRlc2NUZXh0RmllbGQuc2V0VGV4dCggZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICAvL2Rlc2NUZXh0RmllbGQuc2V0QmFja2dyb3VuZCggZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgcHJ1bmVkQ29uc3RyYWludCAKLSAgICAgICAgICAgID0gQ29uc3RyYWludC5wcnVuZUNvbnN0cmFpbnQoIGZhY2V0LCBmcGp3Yy5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHBydW5lZENvbnN0cmFpbnQgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBub3JtYWxpemVkQ29uc3RyYWludAotICAgICAgICAgICAgICAgID0gQ29uc3RyYWludFV0aWwubm9ybWFsaXplKCBDb25zdHJhaW50VXRpbC5jb252ZXJ0KCBwcnVuZWRDb25zdHJhaW50ICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgTGlzdDxDb25zdHJhaW50T3BlcmF0b3I+IHRvcExldmVsT3BlcmF0b3JzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbm9ybWFsaXplZENvbnN0cmFpbnQuZ2V0VHlwZSgpID09IENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLkFORCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9wTGV2ZWxPcGVyYXRvcnMgPSAoIChHcm91cGluZ0NvbnN0cmFpbnRPcGVyYXRvcikgbm9ybWFsaXplZENvbnN0cmFpbnQgKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvcExldmVsT3BlcmF0b3JzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggbm9ybWFsaXplZENvbnN0cmFpbnQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyQ29uc3RyYWludHMoIG5lc3RlZERldGFpbHNDb21wb3NpdGUsIHRvcExldmVsT3BlcmF0b3JzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRldGFpbHMuc2V0TWluSGVpZ2h0KCBuZXN0ZWREZXRhaWxzQ29tcG9zaXRlLmNvbXB1dGVTaXplKCAzMDAsIFNXVC5ERUZBVUxUICkueSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVuZGVyQ29uc3RyYWludHMoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PENvbnN0cmFpbnRPcGVyYXRvcj4gY29uc3RyYWludHMgKQotICAgIHsKLSAgICAgICAgZm9yKCBDb25zdHJhaW50T3BlcmF0b3Igb3AgOiBjb25zdHJhaW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvci5UeXBlIHR5cGUgPSBvcC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBvcCBpbnN0YW5jZW9mIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgbWZvcCA9IChNdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yKSBvcDsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWxUZXh0OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLlJFUVVJUkVTX0FMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQgPSBSZXNvdXJjZXMucmVxdWlyZXNBbGxGYWNldHNMYWJlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDb25zdHJhaW50T3BlcmF0b3IuVHlwZS5SRVFVSVJFU19PTkUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG1mb3AuZ2V0UHJvamVjdEZhY2V0UmVmcygpLnNpemUoKSA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0ID0gUmVzb3VyY2VzLnJlcXVpcmVzRmFjZXRMYWJlbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVGV4dCA9IFJlc291cmNlcy5yZXF1aXJlc09uZU9mRmFjZXRzTGFiZWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0ID0gUmVzb3VyY2VzLmNvbmZsaWN0aW5nRmFjZXRzTGFiZWw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgVGV4dCBsYWJlbCA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKCBnZHZpbmRlbnQoIGdkaGZpbGwoKSwgNSApICk7Ci0gICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCggbGFiZWxUZXh0ICk7Ci0gICAgICAgICAgICAgICAgLy9sYWJlbC5zZXRCYWNrZ3JvdW5kKCBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoIFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgQ29tcG9zaXRlIGZhY2V0c0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgICAgICAgICBmYWNldHNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ2RoaW5kZW50KCBnZHZpbmRlbnQoIGdkaGZpbGwoKSwgNSApLCA1ICkgKTsKLSAgICAgICAgICAgICAgICBmYWNldHNDb21wb3NpdGUuc2V0TGF5b3V0KCBnbHNwYWNpbmcoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApLCAwLCAzICkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFByb2plY3RGYWNldFJlZj4gc29ydGVkUHJvamVjdEZhY2V0UmVmcyAKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RGYWNldFJlZj4oIG1mb3AuZ2V0UHJvamVjdEZhY2V0UmVmcygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCggc29ydGVkUHJvamVjdEZhY2V0UmVmcywgRkFDRVRfUkVGX0NPTVBBUkFUT1IgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIFByb2plY3RGYWNldFJlZiByZXF1aXJlbWVudCA6IHNvcnRlZFByb2plY3RGYWNldFJlZnMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gcmVxdWlyZW1lbnQuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IHJlcXVpcmVtZW50LmdldFZlcnNpb25FeHByKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIGYuZ2V0TGFiZWwoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgdmV4cHIudG9TdHJpbmcoKS5lcXVhbHMoIElWZXJzaW9uRXhwci5XSUxEQ0FSRF9TWU1CT0wgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgISAoIChQcm9qZWN0RmFjZXQpIGYgKS5pc1ZlcnNpb25IaWRkZW4oKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCAnICcgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCB2ZXhwci50b0Rpc3BsYXlTdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbWFnZVdpdGhUZXh0Q29tcG9zaXRlIGZMYWJlbCA9IG5ldyBJbWFnZVdpdGhUZXh0Q29tcG9zaXRlKCBmYWNldHNDb21wb3NpdGUgKTsKLSAgICAgICAgICAgICAgICAgICAgZkxhYmVsLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICAgICAgICAgICAgICBmTGFiZWwuc2V0SW1hZ2UoIHRoaXMuZmFjZXRzU2VsZWN0aW9uUGFuZWwuZ2V0SW1hZ2UoIGYsIGZhbHNlICkgKTsKLSAgICAgICAgICAgICAgICAgICAgZkxhYmVsLnNldFRleHQoIHRleHQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBMYWJlbCByZXF1aXJlZEZhY2V0c0xhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRGYWNldHNMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZEZhY2V0c0xhYmVsLnNldFRleHQoIG9wLmdldFR5cGUoKS5uYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZGhpbmRlbnQoIGdkaGZpbGwoKSwgNSApICk7Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggZ2xzcGFjaW5nKCBnbG1hcmdpbnMoIGdsKCAxICksIDAsIDAgKSwgMCwgMyApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVuZGVyQ29uc3RyYWludHMoIGNvbXBvc2l0ZSwgKCAoR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IpIG9wICkuZ2V0Q2hpbGRyZW4oKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcXVpcmVzRmFjZXRMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNBbGxGYWNldHNMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNPbmVPZkZhY2V0c0xhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25mbGljdGluZ0ZhY2V0c0xhYmVsOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRmFjZXREZXRhaWxzUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0RGV0YWlsc1BhbmVsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0RGV0YWlsc1BhbmVsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmVjNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldERldGFpbHNQYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1yZXF1aXJlc0ZhY2V0TGFiZWwgPSBSZXF1aXJlcyB0aGUgZm9sbG93aW5nIGZhY2V0XDoKLXJlcXVpcmVzQWxsRmFjZXRzTGFiZWwgPSBSZXF1aXJlcyBhbGwgb2YgdGhlIGZvbGxvd2luZyBmYWNldHNcOgotcmVxdWlyZXNPbmVPZkZhY2V0c0xhYmVsID0gUmVxdWlyZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmFjZXRzXDoKLWNvbmZsaWN0aW5nRmFjZXRzTGFiZWwgPSBDb25mbGljdHMgd2l0aCB0aGUgZm9sbG93aW5nIGZhY2V0c1w6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0VWlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE0MWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0VWlQbHVnaW4gCi0KLSAgICBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gCi0gICAgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNJTkdfUFJPUF9QQUdFX0FDVElPTl9DT05GSUdfVkFMSURBVElPTgotICAgICAgICA9IFBMVUdJTl9JRCArICIvcHJvcFBhZ2UvYWN0aW9uQ29uZmlnVmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBGYWNldFVpUGx1Z2luIHBsdWdpbjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBtZXNzYWdlc0xvZ2dlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAKLSAgICBwdWJsaWMgRmFjZXRVaVBsdWdpbigpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBGYWNldFVpUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciggZmluYWwgU3RyaW5nIHBhdGggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIFBMVUdJTl9JRCwgcGF0aCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgKyAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApCi0gICAgewotICAgICAgICBnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvciggZmluYWwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBsb2dFcnJvciggbXNnLCBmYWxzZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1cHByZXNzRHVwbGljYXRlcyApCi0gICAgewotICAgICAgICBpZiggc3VwcHJlc3NEdXBsaWNhdGVzICYmIG1lc3NhZ2VzTG9nZ2VkLmNvbnRhaW5zKCBtc2cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWVzc2FnZXNMb2dnZWQuYWRkKCBtc2cgKTsKLSAgICAgICAgCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKCBmaW5hbCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGxvZ1dhcm5pbmcoIG1zZywgZmFsc2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NEdXBsaWNhdGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBzdXBwcmVzc0R1cGxpY2F0ZXMgJiYgbWVzc2FnZXNMb2dnZWQuY29udGFpbnMoIG1zZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtZXNzYWdlc0xvZ2dlZC5hZGQoIG1zZyApOwotICAgICAgICAKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uIGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIEZhY2V0VWlQbHVnaW4uUExVR0lOX0lELCAwLCBtc2csIGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZ1Byb3BQYWdlQWN0aW9uQ29uZmlnVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gY2hlY2tEZWJ1Z09wdGlvbiggVFJBQ0lOR19QUk9QX1BBR0VfQUNUSU9OX0NPTkZJR19WQUxJREFUSU9OICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tEZWJ1Z09wdGlvbiggZmluYWwgU3RyaW5nIGRlYnVnT3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvcHRpb25WYWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCBkZWJ1Z09wdGlvbiApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9wdGlvblZhbHVlID09IG51bGwgCi0gICAgICAgICAgICAgICA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKCBvcHRpb25WYWx1ZSApLmVxdWFscyggQm9vbGVhbi5UUlVFICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJlMzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0QWN0aW9uRmlsdGVyCi0KLSAgICBpbXBsZW1lbnRzIElBY3Rpb25GaWx0ZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKCBmaW5hbCBPYmplY3QgdGFyZ2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGlmKCBuYW1lLmVxdWFscyggImZhY2V0IiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogPSAoSUZhY2V0ZWRQcm9qZWN0KSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvbiA9IHZhbHVlLmluZGV4T2YoICc6JyApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXhwcnN0cjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbG9uID09IC0xIHx8IGNvbG9uID09IHZhbHVlLmxlbmd0aCgpIC0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgdmV4cHJzdHIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpZCA9IHZhbHVlLnN1YnN0cmluZyggMCwgY29sb24gKTsKLSAgICAgICAgICAgICAgICB2ZXhwcnN0ciA9IHZhbHVlLnN1YnN0cmluZyggY29sb24gKyAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBmaWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgZnByb2ouaGFzUHJvamVjdEZhY2V0KCBmICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHZleHByc3RyID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGYuZ2V0VmVyc2lvbnMoIHZleHByc3RyICkuY29udGFpbnMoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IElBY3Rpb25GaWx0ZXIuY2xhc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZXRlZFByb2plY3RBY3Rpb25GaWx0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQxN2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGVudW0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbWFnZXMKLXsKLSAgICBCQU5ORVJfSU1BR0UoICJmYWNldHMtcGFnZS13aXpiYW4ucG5nIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUEFUSCA9ICJpbWFnZXMvIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotICAgIAotICAgIHByaXZhdGUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbWFnZXMoIGZpbmFsIFN0cmluZyBsb2NhdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmltYWdlRGVzY3JpcHRvciA9IEZhY2V0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCBCQVNFX1BBVEggKyBsb2NhdGlvbiApOwotICAgICAgICB0aGlzLmltYWdlID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VEZXNjcmlwdG9yOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmltYWdlID09IG51bGwgfHwgdGhpcy5pbWFnZS5pc0Rpc3Bvc2VkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmltYWdlID0gdGhpcy5pbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNQcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODg1NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RoZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RoaGludDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2w7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsbWFyZ2luczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuU3d0VXRpbC5ydW5PbkRpc3BsYXlUaHJlYWQ7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklGYWNldFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5Qcm9qZWN0RmFjZXRzVWlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkVuaGFuY2VkSHlwZXJsaW5rOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldHNQcm9wZXJ0eVBhZ2UgCi0KLQlleHRlbmRzIFByb3BlcnR5UGFnZQotCQotewotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YzsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZnVydGhlckNvbmZpZ0NvbXBvc2l0ZTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2woIHBhcmVudCApOwotICAgICAgICBnZXREZWZhdWx0c0J1dHRvbigpLnNldFRleHQoIFJlc291cmNlcy5yZXZlcnRCdXR0b25MYWJlbCApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiggISAoIGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCApICkKLSAgICAgICAgewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0gICAgICAgIAotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy50b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0KLSAgICAgICAgdGhpcy50b3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLSAgICAgICAgdGhpcy50b3BDb21wb3NpdGUuc2V0TGF5b3V0KCBnbG1hcmdpbnMoIGdsKCAxICksIDAsIDAsIDAsIDUgKSApOwotCi0gICAgICAgIHRoaXMuZnBqd2MgPSBTaGFyZWRXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoIHRoaXMucHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgRmFjZXRzU2VsZWN0aW9uUGFuZWwgZmFjZXRzU2VsZWN0aW9uUGFuZWwgCi0gICAgICAgIAk9IG5ldyBGYWNldHNTZWxlY3Rpb25QYW5lbCggdGhpcy50b3BDb21wb3NpdGUsIHRoaXMuZnBqd2MgKTsKLSAgICAgICAgCi0gICAgICAgIGZhY2V0c1NlbGVjdGlvblBhbmVsLnNldExheW91dERhdGEoIGdkZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZwandjLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgCW5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgIAl7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkgCi0JCQkJewotCQkJCQloYW5kbGVQcm9qZWN0TW9kaWZpZWRFdmVudCgpOwotCQkJCX0KLSAgICAgICAgCX0sCi0gICAgICAgIAlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQKLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnVydGhlckNvbmZpZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHRoaXMudG9wQ29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICAKLSAgICAgICAgdXBkYXRlRnVydGhlckNvbmZpZ0h5cGVybGluaygpOwotICAgICAgICAKLSAgICAgICAgdGhpcy50b3BDb21wb3NpdGUuYWRkRGlzcG9zZUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBEaXNwb3NlTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKCBmaW5hbCBEaXNwb3NlRXZlbnQgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNwb3NlRXZlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KCBwYXJlbnQgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLnRvcENvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgCi0JewotCSAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mcGp3Yy5nZXRGYWNldGVkUHJvamVjdCgpLmdldFByb2plY3RGYWNldHMoKSApCi0JICAgIHsKLQkgICAgICAgIGlmKCBmdi5nZXRQbHVnaW5JZCgpID09IG51bGwgfHwgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBmaW5hbCBNZXNzYWdlRGlhbG9nIGRpYWxvZyAKLQkgICAgICAgICAgICAgICAgPSBuZXcgTWVzc2FnZURpYWxvZyggZ2V0U2hlbGwoKSwgUmVzb3VyY2VzLndhcm5pbmdEaWFsb2dUaXRsZSwgbnVsbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLm1vZGlmeVdpdGhVbmtub3duV2FybmluZ01lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDEgKTsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBpZiggZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0sgKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCSAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgCUZhY2V0c1Byb3BlcnR5UGFnZS50aGlzLmZwandjLmNvbW1pdENoYW5nZXMoIG1vbml0b3IgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICB3cy5ydW4oIHdyLCB3cy5nZXRSb290KCksIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBtb25pdG9yICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyggZ2V0U2hlbGwoKSApLnJ1biggdHJ1ZSwgZmFsc2UsIG9wICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSAKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2goIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApIAotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgdGUgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJU3RhdHVzIHN0ID0gKCAoQ29yZUV4Y2VwdGlvbikgdGUgKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gc3QuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgaWYoICEgKCB0ZSBpbnN0YW5jZW9mIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uICkgfHwKLSAgICAgICAgICAgICAgICAgICAgISAoIChGYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbikgdGUgKS5pc0V4cGVjdGVkKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIHN0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IHN0LmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjYXVzZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3QgPSAoIChDb3JlRXhjZXB0aW9uKSBjYXVzZSApLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvciggZ2V0U2hlbGwoKSwgUmVzb3VyY2VzLmVyckRsZ1RpdGxlLCBtc2csIHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIHRlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZmFpbGVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZnBqd2MucmV2ZXJ0Q2hhbmdlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSAKLQl7Ci0JCXBlcmZvcm1PaygpOwotCQl1cGRhdGVGdXJ0aGVyQ29uZmlnSHlwZXJsaW5rKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgCi0JewotCQl0aGlzLmZwandjLnJldmVydENoYW5nZXMoKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RNb2RpZmllZEV2ZW50KCkKLQl7Ci0gICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVGdXJ0aGVyQ29uZmlnSHlwZXJsaW5rKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBydW5PbkRpc3BsYXlUaHJlYWQoIHRoaXMudG9wQ29tcG9zaXRlLmdldERpc3BsYXkoKSwgcnVubmFibGUgKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZ1cnRoZXJDb25maWdIeXBlcmxpbmsoKQotCXsKLQkJZm9yKCBDb250cm9sIGNoaWxkIDogdGhpcy5mdXJ0aGVyQ29uZmlnQ29tcG9zaXRlLmdldENoaWxkcmVuKCkgKQotCQl7Ci0JCQljaGlsZC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UgCi0JCQk9IHRoaXMuZnBqd2MuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0JCQotCQlmaW5hbCBib29sZWFuIGJhc2ljVmFsaWRhdGlvbkVycm9yc1ByZXNlbnQgCi0JCSAgICA9ICggdGhpcy5mcGp3Yy52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApOwotCQkKLQkJYm9vbGVhbiBhY3Rpb25Db25maWdFcnJvcnNQcmVzZW50ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29uZmlnUGFnZXNBdmFpbGFibGUgPSBmYWxzZTsKLQkJCi0JCWlmKCAhIGJhc2ljVmFsaWRhdGlvbkVycm9yc1ByZXNlbnQgKQotCQl7Ci0JCQlmb3IoIElGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uIDogdGhpcy5mcGp3Yy5nZXRQcm9qZWN0RmFjZXRBY3Rpb25zKCkgKQotCQkJewotCQkJICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAKLQkJCQlpZiggISBjb25maWdQYWdlc0F2YWlsYWJsZSApCi0JCQkJewotCQkgICAgICAgICAgICB0cnkKLQkJICAgICAgICAgICAgewotCQkgICAgICAgICAgICAJZmluYWwgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlIGFjdGlvblR5cGUgPSBhY3Rpb24uZ2V0VHlwZSgpOwotCQkgICAgCQkJZmluYWwgSUFjdGlvbkRlZmluaXRpb24gYWN0aW9uZGVmID0gZnYuZ2V0QWN0aW9uRGVmaW5pdGlvbiggYmFzZSwgYWN0aW9uVHlwZSApOwotCQkgICAgICAgICAgICAgICAgCi0JCSAgICAgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VyLmdldFdpemFyZFBhZ2VzKCBhY3Rpb25kZWYuZ2V0SWQoKSApLmlzRW1wdHkoKSApCi0JCSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAJY29uZmlnUGFnZXNBdmFpbGFibGUgPSB0cnVlOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotCQkgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggZSApOwotCQkgICAgICAgICAgICB9Ci0JCQkJfQotCQkJCQotCQkJCWlmKCAhIGFjdGlvbkNvbmZpZ0Vycm9yc1ByZXNlbnQgKQotCQkJCXsKLQkgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGFjdGlvbi5nZXRDb25maWcoKTsKLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgIGlmKCBjb25maWcgIT0gbnVsbCApCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIElBY3Rpb25Db25maWcgYyA9IG51bGw7Ci0JICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgaW5zdGFuY2VvZiBJQWN0aW9uQ29uZmlnICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBjID0gKElBY3Rpb25Db25maWcpIGNvbmZpZzsKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQWRhcHRlck1hbmFnZXIgbSA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQgPSBJQWN0aW9uQ29uZmlnLmNsYXNzLmdldE5hbWUoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBjID0gKElBY3Rpb25Db25maWcpIG0ubG9hZEFkYXB0ZXIoIGNvbmZpZywgdCApOwotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICBpZiggYyAhPSBudWxsICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHJlc3VsdCA9IGMudmFsaWRhdGUoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0JICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUFjdGlvbkNvbmZpZ1ZhbGlkYXRpb24oIGZ2LCByZXN1bHQgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAJYWN0aW9uQ29uZmlnRXJyb3JzUHJlc2VudCA9IHRydWU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICBBY3Rpb25Db25maWcgYzIgPSBudWxsOwotCSAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICBpZiggY29uZmlnIGluc3RhbmNlb2YgQWN0aW9uQ29uZmlnICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IChBY3Rpb25Db25maWcpIGNvbmZpZzsKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNvbmZpZyAhPSBudWxsICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQWRhcHRlck1hbmFnZXIgbSA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQgPSBBY3Rpb25Db25maWcuY2xhc3MuZ2V0TmFtZSgpOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gKEFjdGlvbkNvbmZpZykgbS5sb2FkQWRhcHRlciggY29uZmlnLCB0ICk7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgIGlmKCBjMiAhPSBudWxsICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHJlc3VsdCA9IGMyLnZhbGlkYXRlKCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotCSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VBY3Rpb25Db25maWdWYWxpZGF0aW9uKCBmdiwgcmVzdWx0ICk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgCWFjdGlvbkNvbmZpZ0Vycm9yc1ByZXNlbnQgPSB0cnVlOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmKCBjb25maWdQYWdlc0F2YWlsYWJsZSApCi0JCXsKLQkgICAgICAgIGZpbmFsIElTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQotCSAgICAgICAgZmluYWwgQ29sb3IgaW5mb0JhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgCT0gdGhpcy50b3BDb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EICk7Ci0JICAgICAgICAKLQkgICAgICAgIHRoaXMuZnVydGhlckNvbmZpZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLQkgICAgICAgIHRoaXMuZnVydGhlckNvbmZpZ0NvbXBvc2l0ZS5zZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMiwgMCwgMCApICk7Ci0JICAgICAgICAKLQkgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBzdWJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCB0aGlzLmZ1cnRoZXJDb25maWdDb21wb3NpdGUsIFNXVC5CT1JERVIgKTsKLQkgICAgICAgIHN1YkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotCSAgICAgICAgc3ViQ29tcG9zaXRlLnNldExheW91dCggZ2xtYXJnaW5zKCBnbCggMiApLCA1LCA1ICkgKTsKLQkgICAgICAgIHN1YkNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKCBpbmZvQmFja2dyb3VuZENvbG9yICk7Ci0JICAgICAgICAKLQkgICAgICAgIGZpbmFsIExhYmVsIGltYWdlID0gbmV3IExhYmVsKCBzdWJDb21wb3NpdGUsIFNXVC5OT05FICk7Ci0JICAgICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKCBpbmZvQmFja2dyb3VuZENvbG9yICk7Ci0JICAgICAgICAKLQkgICAgICAgIGZpbmFsIFN0cmluZyBpbWFnZVR5cGUgCi0JICAgICAgICAJPSAoIGFjdGlvbkNvbmZpZ0Vycm9yc1ByZXNlbnQgPyBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyA6IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0sgKTsKLQkgICAgICAgIAotCSAgICAgICAgaW1hZ2Uuc2V0SW1hZ2UoIHNoYXJlZEltYWdlcy5nZXRJbWFnZSggaW1hZ2VUeXBlICkgKTsKLQotCSAgICAgICAgZmluYWwgRW5oYW5jZWRIeXBlcmxpbmsgbGluayA9IG5ldyBFbmhhbmNlZEh5cGVybGluayggc3ViQ29tcG9zaXRlLCBTV1QuTk9ORSApOwotCSAgICAgICAgbGluay5zZXRCYWNrZ3JvdW5kKCBpbmZvQmFja2dyb3VuZENvbG9yICk7Ci0JCi0JCQlpZiggYWN0aW9uQ29uZmlnRXJyb3JzUHJlc2VudCApCi0JCQl7Ci0JCQkJbGluay5zZXRUZXh0KCBSZXNvdXJjZXMuZnVydGhlckNvbmZpZ1JlcXVpcmVkICk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbGluay5zZXRUZXh0KCBSZXNvdXJjZXMuZnVydGhlckNvbmZpZ0F2YWlsYWJsZSApOwotCQkJfQotCQkJCi0JCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyCi0JCQkoCi0JCQkJbmV3IEh5cGVybGlua0FkYXB0ZXIoKQotCQkJCXsKLQkJCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZCggZmluYWwgSHlwZXJsaW5rRXZlbnQgZXZlbnQgKSAKLQkJCQkJewotCQkJCQkJaGFuZGxlRnVydGhlckNvbmZpZ0h5cGVybGlua0V2ZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGhpcy5mdXJ0aGVyQ29uZmlnQ29tcG9zaXRlLnNldExheW91dERhdGEoIGdkaGhpbnQoIGdkKCksIDAgKSApOwotCQl9Ci0JCQotCQl0aGlzLnRvcENvbXBvc2l0ZS5sYXlvdXQoIHRydWUsIHRydWUgKTsKLQkJCi0JCXNldFZhbGlkKCAhIGJhc2ljVmFsaWRhdGlvbkVycm9yc1ByZXNlbnQgJiYgISBhY3Rpb25Db25maWdFcnJvcnNQcmVzZW50ICk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVGdXJ0aGVyQ29uZmlnSHlwZXJsaW5rRXZlbnQoKQotCXsKLQkJZmluYWwgSVdpemFyZCB3aXphcmQgPSBuZXcgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQoIHRoaXMuZnBqd2MgKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGdldFNob3dGYWNldHNTZWxlY3Rpb25QYWdlKCkgCi0JCQl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIAotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSAKLQkJCXsKLQkJCQlmb3IoIElXaXphcmRQYWdlIHBhZ2UgOiBnZXRQYWdlcygpICkKLQkJCQl7Ci0JCQkJCWZpbmFsIElGYWNldFdpemFyZFBhZ2UgZmFjZXRQYWdlID0gKElGYWNldFdpemFyZFBhZ2UpIHBhZ2U7Ci0JCQkJCWZhY2V0UGFnZS50cmFuc2ZlclN0YXRlVG9Db25maWcoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JCQotCQlmaW5hbCBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyggZ2V0U2hlbGwoKSwgd2l6YXJkICkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkgCi0JCQl7Ci0JCQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhciggcGFyZW50ICk7Ci0JCQkJCi0JCQkJZ2V0QnV0dG9uKCBJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9JRCApLnNldFRleHQoIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgKTsKLQkJCQlnZXRCdXR0b24oIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEICkuZGlzcG9zZSgpOwotCQkJCSggKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSApLm51bUNvbHVtbnMtLTsKLQkJCX0KLQkJfTsKLQkJCi0JCWRpYWxvZy5vcGVuKCk7Ci0JCXVwZGF0ZUZ1cnRoZXJDb25maWdIeXBlcmxpbmsoKTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGlzcG9zZUV2ZW50KCkKLSAgICB7Ci0gICAgICAgIFNoYXJlZFdvcmtpbmdDb3B5TWFuYWdlci5yZWxlYXNlV29ya2luZ0NvcHkoIHRoaXMucHJvamVjdCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdHJhY2VBY3Rpb25Db25maWdWYWxpZGF0aW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHJlc3VsdCApCi0gICAgewotICAgICAgICBpZiggRmFjZXRVaVBsdWdpbi5pc1RyYWNpbmdQcm9wUGFnZUFjdGlvbkNvbmZpZ1ZhbGlkYXRpb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSArICIgOiAiICsgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggcmVzdWx0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBlID0gcmVzdWx0LmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoIHN3ICk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoIHB3ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMgCi0gICAgCi0gICAgCWV4dGVuZHMgTkxTCi0gICAgCQotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2ZXJ0QnV0dG9uTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1cnRoZXJDb25maWdBdmFpbGFibGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1cnRoZXJDb25maWdSZXF1aXJlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyRGxnVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEaWFsb2dUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5V2l0aFVua25vd25XYXJuaW5nTWVzc2FnZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZhY2V0c1Byb3BlcnR5UGFnZS5jbGFzcy5nZXROYW1lKCksIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1Byb3BlcnR5UGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNQcm9wZXJ0eVBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYTgyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1Byb3BlcnR5UGFnZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1yZXZlcnRCdXR0b25MYWJlbCA9IFJldmVydAotZnVydGhlckNvbmZpZ0F2YWlsYWJsZSA9IEZ1cnRoZXIgY29uZmlndXJhdGlvbiBhdmFpbGFibGUuLi4KLWZ1cnRoZXJDb25maWdSZXF1aXJlZCA9IEZ1cnRoZXIgY29uZmlndXJhdGlvbiByZXF1aXJlZC4uLgotZXJyRGxnVGl0bGUgPSBFcnJvcgotd2FybmluZ0RpYWxvZ1RpdGxlID0gV2FybmluZwotbW9kaWZ5V2l0aFVua25vd25XYXJuaW5nTWVzc2FnZSA9IE1vZGlmeWluZyBhIGZhY2V0ZWQgcHJvamVjdCB3aGVuIGltcGxlbWVudGF0aW9ucyBvZiBvbmUgb3IgbW9yZSBpbnN0YWxsZWQgZmFjZXRzIGFyZSBub3QgYXZhaWxhYmxlIGNhbiBwb3RlbnRpYWxseSByZXN1bHQgaW4gYSBjb3JydXB0ZWQgcHJvamVjdC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYzVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2w7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsbWFyZ2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRzU2VsZWN0aW9uRGlhbG9nCi0KLSAgICBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0gICAgcHJpdmF0ZSBGYWNldHNTZWxlY3Rpb25QYW5lbCBwYW5lbDsKLQotICAgIHB1YmxpYyBGYWNldHNTZWxlY3Rpb25EaWFsb2coIGZpbmFsIFNoZWxsIHBhcmVudFNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnRTaGVsbCApOwotICAgICAgICAKLSAgICAgICAgc2V0U2hlbGxTdHlsZSggZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSApOwotCi0gICAgICAgIHRoaXMuZnBqd2MgPSBmcGp3YzsKLSAgICAgICAgdGhpcy5wYW5lbCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgICB7Ci0gICAgICAgIHBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoIFJlc291cmNlcy5kaWFsb2dUaXRsZSApOwotICAgICAgICBzZXRUaXRsZSggUmVzb3VyY2VzLmRpYWxvZ1RpdGxlICk7Ci0gICAgICAgIHNldE1lc3NhZ2UoIFJlc291cmNlcy5kaWFsb2dEZXNjcmlwdGlvbiApOwotICAgICAgICBzZXRUaXRsZUltYWdlKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltYWdlcy5CQU5ORVJfSU1BR0UuZ2V0SW1hZ2UoKSApOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBkaWFsb2dDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKCBwYXJlbnQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBkaWFsb2dDb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBnbG1hcmdpbnMoIGdsKCAxICksIDUsIDUgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wYW5lbCA9IG5ldyBGYWNldHNTZWxlY3Rpb25QYW5lbCggY29tcG9zaXRlLCB0aGlzLmZwandjICk7Ci0gICAgICAgIHRoaXMucGFuZWwuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLSAgICAgICAgdGhpcy5wYW5lbC5zZXRGb2N1cygpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKQotICAgIHsKLSAgICAgICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogcmV2ZXJ0IGNoYW5nZXMuCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW5EaWFsb2coIGZpbmFsIFNoZWxsIHBhcmVudFNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICAgKCBuZXcgRmFjZXRzU2VsZWN0aW9uRGlhbG9nKCBwYXJlbnRTaGVsbCwgZnBqd2MgKSApLm9wZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0Rlc2NyaXB0aW9uOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRmFjZXRzU2VsZWN0aW9uRGlhbG9nLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvbkRpYWxvZy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25EaWFsb2cucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MjE3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvbkRpYWxvZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1kaWFsb2dUaXRsZSA9IFByb2plY3QgRmFjZXRzCi1kaWFsb2dEZXNjcmlwdGlvbiA9IFNlbGVjdCB0aGUgZmFjZXRzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRzU2VsZWN0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjkxMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5GYWNldFVpSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0c1NlbGVjdGlvblBhZ2UKLQotICAgIGV4dGVuZHMgV2l6YXJkUGFnZQotCi17Ci0gICAgcHVibGljIEZhY2V0c1NlbGVjdGlvblBhbmVsIHBhbmVsOwotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0KLSAgICBwdWJsaWMgRmFjZXRzU2VsZWN0aW9uUGFnZSggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICBzdXBlciggImZhY2V0cy5zZWxlY3Rpb24ucGFnZSIgKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNldFRpdGxlKCBSZXNvdXJjZXMucGFnZVRpdGxlICk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCBSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uICk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvciggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbWFnZXMuQkFOTkVSX0lNQUdFLmdldEltYWdlRGVzY3JpcHRvcigpICk7Ci0KLSAgICAgICAgdGhpcy5mcGp3YyA9IGZwandjOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGFuZWwgPSBuZXcgRmFjZXRzU2VsZWN0aW9uUGFuZWwoIHBhcmVudCwgdGhpcy5mcGp3YyApOwotICAgICAgICAKLSAgICAgICAgdXBkYXRlUGFnZVN0YXRlKCk7Ci0KLSAgICAgICAgdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQYWdlU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVECi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciA9IG5ldyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZVBhZ2VTdGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgUnVudGltZU1hbmFnZXIuYWRkTGlzdGVuZXIoIHJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUuVkFMSURBVElPTl9TVEFUVVNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wYW5lbC5hZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IERpc3Bvc2VMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoIGZpbmFsIERpc3Bvc2VFdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKCBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgICAgICBoLnNldEhlbHAoIHRoaXMucGFuZWwsIEZhY2V0VWlIZWxwQ29udGV4dElkcy5GQUNFVFNfU0VMRUNUSU9OX1BBR0UgKTsKLSAgICAgICAgCi0gICAgICAgIHNldENvbnRyb2woIHRoaXMucGFuZWwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGFnZVN0YXRlKCkKLSAgICB7Ci0gICAgICAgIGlmKCAhIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZXF1YWxzKCB0aGlzLnBhbmVsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUnVubmFibGUgdWlSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhZ2VTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMucGFuZWwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggdWlSdW5uYWJsZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKCB0aGlzLnBhbmVsLmlzU2VsZWN0aW9uVmFsaWQoKSApOwotCi0gICAgICAgIGlmKCBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKCBmaW5hbCBib29sZWFuIHZpc2libGUgKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSggdmlzaWJsZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHZpc2libGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhbmVsLnNldEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZhY2V0c1NlbGVjdGlvblBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvblBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYjEzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvblBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcGFnZVRpdGxlID0gUHJvamVjdCBGYWNldHMKLXBhZ2VEZXNjcmlwdGlvbiA9IFNlbGVjdCB0aGUgZmFjZXRzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgcHJvamVjdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvblBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0ZhY2V0c1NlbGVjdGlvblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWQxNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWF4OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhoaW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGhzcGFuOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZHdoaW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2xtYXJnaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5Td3RVdGlsLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5FZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LlRvb2xUaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5Qcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklEZWNvcmF0aW9uc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5Nb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5CYXNpY1Rvb2xUaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuSGVhZGVyVG9vbFRpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5SZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldHNTZWxlY3Rpb25QYW5lbAotCi0gICAgZXh0ZW5kcyBDb21wb3NpdGUKLSAgICBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENXX0ZBQ0VUID0gImN3LmZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDV19WRVJTSU9OID0gImN3LnZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBU0gxVzEgPSAic2FzaC4xLndlaWdodC4xIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVNIMVcyID0gInNhc2guMS53ZWlnaHQuMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FTSDJXMSA9ICJzYXNoLjIud2VpZ2h0LjEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBU0gyVzIgPSAic2FzaC4yLndlaWdodC4yIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRE9XTl9BUlJPVyA9ICIjI2Rvd24tYXJyb3cjIyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTYXNoRm9ybSBzZm9ybTE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTYXNoRm9ybSBzZm9ybTI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMYWJlbCBwcmVzZXRzTGFiZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21ibyBwcmVzZXRzQ29tYm87Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdXR0b24gc2F2ZVByZXNldEJ1dHRvbjsKLSAgICBwcml2YXRlIGZpbmFsIEJ1dHRvbiBkZWxldGVQcmVzZXRCdXR0b247Ci0gICAgcHJpdmF0ZSBmaW5hbCBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIGZpbmFsIFRyZWUgdHJlZTsKLSAgICBwcml2YXRlIGZpbmFsIFRyZWVWaWV3ZXJDb2x1bW4gY29sRmFjZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUcmVlVmlld2VyQ29sdW1uIGNvbFZlcnNpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaXhlZEZhY2V0VG9vbFRpcCBmaXhlZEZhY2V0VG9vbFRpcDsKLSAgICBwcml2YXRlIGZpbmFsIE1lbnUgcG9wdXBNZW51OwotICAgIHByaXZhdGUgZmluYWwgTWVudUl0ZW0gcG9wdXBNZW51TG9ja1VubG9jazsKLSAgICBwcml2YXRlIGZpbmFsIE1lbnVJdGVtIHBvcHVwTWVudUNoYW5nZVZlcnNpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBUYWJsZVZpZXdlciBwcm9ibGVtc1ZpZXc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUYWJJdGVtIGRldGFpbHNUYWJJdGVtOwotICAgIHByaXZhdGUgZmluYWwgRGV0YWlsc1BhbmVsIGRldGFpbHNQYW5lbDsKLSAgICBwcml2YXRlIGZpbmFsIFRhYkl0ZW0gcnVudGltZXNUYWJJdGVtOwotICAgIHByaXZhdGUgZmluYWwgUnVudGltZXNQYW5lbCBydW50aW1lc1BhbmVsOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93VG9vbFRpcHM7Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YzsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+IHJlZ2lzdGVyZWRXb3JraW5nQ29weUxpc3RlbmVyczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPiBzZWxlY3RlZFZlcnNpb25zOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25MaXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBPYmplY3Qgc2VsZWN0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEhvbGRzIGltYWdlcyB1c2VkIHRocm91Z2hvdXQgdGhlIHBhbmVsLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgZmluYWwgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotICAgIAotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci0gICAgCi0gICAgcHVibGljIGludGVyZmFjZSBJRmlsdGVyIAotICAgIHsKLSAgICAgICAgYm9vbGVhbiBjaGVjayggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFjZXRzU2VsZWN0aW9uUGFuZWwoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICBzdXBlciggcGFyZW50LCBTV1QuTk9ORSApOwotCi0gICAgICAgIHRoaXMuZnBqd2MgPSBmcGp3YzsKLSAgICAgICAgdGhpcy5yZWdpc3RlcmVkV29ya2luZ0NvcHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPigpOyAKLSAgICAgICAgdGhpcy5zZWxlY3RlZFZlcnNpb25zID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsOwotICAgICAgICB0aGlzLnNlbGVjdGlvbkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLSAgICAgICAgdGhpcy5zaG93VG9vbFRpcHMgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGltYWdlIHJlZ2lzdHJ5LgotICAgICAgICAKLSAgICAgICAgdGhpcy5pbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLSAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggRmFjZXRVaVBsdWdpbi5QTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoICJpbWFnZXMvZG93bi1hcnJvdy5naWYiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5pbWFnZVJlZ2lzdHJ5LnB1dCggSU1HX0RPV05fQVJST1csIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKCB1cmwgKSApOwotCi0gICAgICAgIC8vIFJlYWQgdGhlIGRpYWxvZyBzZXR0aW5ncy4KLQotICAgICAgICBmaW5hbCBJRGlhbG9nU2V0dGluZ3Mgcm9vdAotICAgICAgICAgICAgPSBGYWNldFVpUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotICAgICAgICBJRGlhbG9nU2V0dGluZ3MgdGVtcCA9IHJvb3QuZ2V0U2VjdGlvbiggZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLQotICAgICAgICBpZiggdGVtcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IHJvb3QuYWRkTmV3U2VjdGlvbiggZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHRlbXA7Ci0KLSAgICAgICAgLy8gTGF5b3V0IHRoZSBwYW5lbC4KLQotICAgICAgICBzZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnRvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHRoaXMsIFNXVC5OT05FICk7Ci0gICAgICAgIHRoaXMudG9wQ29tcG9zaXRlLnNldExheW91dCggZ2xtYXJnaW5zKCBnbCggNCApLCAwLCAwICkgKTsKLSAgICAgICAgdGhpcy50b3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucHJlc2V0c0xhYmVsID0gbmV3IExhYmVsKCB0aGlzLnRvcENvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5wcmVzZXRzTGFiZWwuc2V0VGV4dCggUmVzb3VyY2VzLnByZXNldHNMYWJlbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wcmVzZXRzQ29tYm8gPSBuZXcgQ29tYm8oIHRoaXMudG9wQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIHRoaXMucHJlc2V0c0NvbWJvLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zYXZlUHJlc2V0QnV0dG9uID0gbmV3IEJ1dHRvbiggdGhpcy50b3BDb21wb3NpdGUsIFNXVC5QVVNIICk7Ci0gICAgICAgIHRoaXMuc2F2ZVByZXNldEJ1dHRvbi5zZXRUZXh0KCBSZXNvdXJjZXMuc2F2ZUJ1dHRvbkxhYmVsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNhdmVQcmVzZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNhdmVQcmVzZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgdGhpcy5kZWxldGVQcmVzZXRCdXR0b24gPSBuZXcgQnV0dG9uKCB0aGlzLnRvcENvbXBvc2l0ZSwgU1dULlBVU0ggKTsKLSAgICAgICAgdGhpcy5kZWxldGVQcmVzZXRCdXR0b24uc2V0VGV4dCggUmVzb3VyY2VzLmRlbGV0ZUJ1dHRvbkxhYmVsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlbGV0ZVByZXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlUHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgaW50IHdpZHRoIAotICAgICAgICAgICAgPSBNYXRoLm1heCggZ2V0UHJlZmVycmVkV2lkdGgoIHRoaXMuc2F2ZVByZXNldEJ1dHRvbiApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZWZlcnJlZFdpZHRoKCB0aGlzLmRlbGV0ZVByZXNldEJ1dHRvbiApICkgKyAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0aGlzLnNhdmVQcmVzZXRCdXR0b24uc2V0TGF5b3V0RGF0YSggZ2R3aGludCggZ2QoKSwgd2lkdGggKSApOwotICAgICAgICB0aGlzLmRlbGV0ZVByZXNldEJ1dHRvbi5zZXRMYXlvdXREYXRhKCBnZHdoaW50KCBnZCgpLCB3aWR0aCApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNmb3JtMSA9IG5ldyBTYXNoRm9ybSggdGhpcy50b3BDb21wb3NpdGUsIFNXVC5WRVJUSUNBTCB8IFNXVC5TTU9PVEggKTsKLSAgICAgICAgdGhpcy5zZm9ybTEuc2V0TGF5b3V0RGF0YSggZ2Roc3BhbiggZ2RmaWxsKCksIDQgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zZm9ybTIgPSBuZXcgU2FzaEZvcm0oIHRoaXMuc2Zvcm0xLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TTU9PVEggKTsKLSAgICAgICAgdGhpcy5zZm9ybTIuc2V0TGF5b3V0RGF0YSggZ2Roc3BhbiggZ2RmaWxsKCksIDQgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy50cmVlVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlciggdGhpcy5zZm9ybTIsIFNXVC5CT1JERVIgKTsKLSAgICAgICAgdGhpcy50cmVlID0gdGhpcy50cmVlVmlld2VyLmdldFRyZWUoKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHJlZS5zZXRIZWFkZXJWaXNpYmxlKCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKCBuZXcgQ29udGVudFByb3ZpZGVyKCkgKTsKLSAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldFNvcnRlciggbmV3IFNvcnRlcigpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbEZhY2V0ID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4oIHRoaXMudHJlZVZpZXdlciwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5jb2xGYWNldC5nZXRDb2x1bW4oKS5zZXRUZXh0KCBSZXNvdXJjZXMuZmFjZXRDb2x1bW5MYWJlbCApOwotICAgICAgICB0aGlzLmNvbEZhY2V0LmdldENvbHVtbigpLnNldFJlc2l6YWJsZSggdHJ1ZSApOwotICAgICAgICB0aGlzLmNvbEZhY2V0LnNldExhYmVsUHJvdmlkZXIoIG5ldyBGYWNldENvbHVtbkxhYmVsUHJvdmlkZXIoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3MuZ2V0KCBDV19GQUNFVCApID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnB1dCggQ1dfRkFDRVQsIGNvbXB1dGVEZWZhdWx0RmFjZXRDb2x1bW5XaWR0aCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29sRmFjZXQuZ2V0Q29sdW1uKCkuc2V0V2lkdGgoIHRoaXMuc2V0dGluZ3MuZ2V0SW50KCBDV19GQUNFVCApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbEZhY2V0LmdldENvbHVtbigpLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIFNXVC5SZXNpemUsCi0gICAgICAgICAgICBuZXcgTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldHNTZWxlY3Rpb25QYW5lbC50aGlzLnNldHRpbmdzLnB1dCggQ1dfRkFDRVQsIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuY29sRmFjZXQuZ2V0Q29sdW1uKCkuZ2V0V2lkdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICB0aGlzLmNvbFZlcnNpb24gPSBuZXcgVHJlZVZpZXdlckNvbHVtbiggdGhpcy50cmVlVmlld2VyLCBTV1QuTk9ORSApOwotICAgICAgICB0aGlzLmNvbFZlcnNpb24uZ2V0Q29sdW1uKCkuc2V0VGV4dCggUmVzb3VyY2VzLnZlcnNpb25Db2x1bW5MYWJlbCApOwotICAgICAgICB0aGlzLmNvbFZlcnNpb24uZ2V0Q29sdW1uKCkuc2V0UmVzaXphYmxlKCB0cnVlICk7Ci0gICAgICAgIHRoaXMuY29sVmVyc2lvbi5zZXRMYWJlbFByb3ZpZGVyKCBuZXcgRmFjZXRWZXJzaW9uQ29sdW1uTGFiZWxQcm92aWRlcigpICk7Ci0gICAgICAgIHRoaXMuY29sVmVyc2lvbi5zZXRFZGl0aW5nU3VwcG9ydCggbmV3IEZhY2V0VmVyc2lvbkNvbHVtbkVkaXRpbmdTdXBwb3J0KCB0aGlzLnRyZWVWaWV3ZXIgKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3MuZ2V0KCBDV19WRVJTSU9OICkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MucHV0KCBDV19WRVJTSU9OLCBjb21wdXRlRGVmYXVsdFZlcnNpb25Db2x1bW5XaWR0aCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbFZlcnNpb24uZ2V0Q29sdW1uKCkuc2V0V2lkdGgoIHRoaXMuc2V0dGluZ3MuZ2V0SW50KCBDV19WRVJTSU9OICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29sVmVyc2lvbi5nZXRDb2x1bW4oKS5hZGRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBTV1QuUmVzaXplLAotICAgICAgICAgICAgbmV3IExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRzU2VsZWN0aW9uUGFuZWwudGhpcy5zZXR0aW5ncy5wdXQoIENXX1ZFUlNJT04sIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuY29sVmVyc2lvbi5nZXRDb2x1bW4oKS5nZXRXaWR0aCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wb3B1cE1lbnUgPSBuZXcgTWVudSggZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wb3B1cE1lbnVDaGFuZ2VWZXJzaW9uID0gbmV3IE1lbnVJdGVtKCB0aGlzLnBvcHVwTWVudSwgU1dULlBVU0ggKTsKLSAgICAgICAgdGhpcy5wb3B1cE1lbnVDaGFuZ2VWZXJzaW9uLnNldFRleHQoIFJlc291cmNlcy5jaGFuZ2VWZXJzaW9uTWVudUl0ZW0gKTsKLQotICAgICAgICB0aGlzLnBvcHVwTWVudUNoYW5nZVZlcnNpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZVZlcnNpb25NZW51U2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnBvcHVwTWVudUxvY2tVbmxvY2sgPSBuZXcgTWVudUl0ZW0oIHRoaXMucG9wdXBNZW51LCBTV1QuUFVTSCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wb3B1cE1lbnVMb2NrVW5sb2NrLmFkZFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVGYWNldExvY2tVbmxvY2soKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgbmV3IEZhY2V0VG9vbFRpcCggdGhpcy50cmVlICk7Ci0gICAgICAgIG5ldyBDYXRlZ29yeVRvb2xUaXAoIHRoaXMudHJlZSApOwotICAgICAgICB0aGlzLmZpeGVkRmFjZXRUb29sVGlwID0gbmV3IEZpeGVkRmFjZXRUb29sVGlwKCB0aGlzLnRyZWUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHJlZVZpZXdlci5zZXRJbnB1dCggbmV3IE9iamVjdCgpICk7Ci0KLSAgICAgICAgdGhpcy50cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCggZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRzU2VsZWN0aW9uUGFuZWwudGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZCggZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuaGFuZGxlQ2hlY2tTdGF0ZUNoYW5nZWQoIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgdGhpcy50cmVlLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIFNXVC5QYWludEl0ZW0sCi0gICAgICAgICAgICBuZXcgTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYWludEl0ZW1FdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnRyZWUuYWRkTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgU1dULk1vdXNlRG93biwKLSAgICAgICAgICAgIG5ldyBMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93bkV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFRhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKCB0aGlzLnNmb3JtMiwgU1dULk5PTkUgKTsKLSAgICAgICAgdGFiRm9sZGVyLnNldExheW91dERhdGEoIGdkaGhpbnQoIGdkaGZpbGwoKSwgODAgKSApOwotCi0gICAgICAgIHRoaXMuZGV0YWlsc1BhbmVsID0gbmV3IERldGFpbHNQYW5lbCggdGFiRm9sZGVyLCB0aGlzICk7Ci0gICAgICAgIHRoaXMuZGV0YWlsc1RhYkl0ZW0gPSBuZXcgVGFiSXRlbSggdGFiRm9sZGVyLCBTV1QuTlVMTCApOwotICAgICAgICB0aGlzLmRldGFpbHNUYWJJdGVtLnNldENvbnRyb2woIHRoaXMuZGV0YWlsc1BhbmVsICk7Ci0gICAgICAgIHRoaXMuZGV0YWlsc1RhYkl0ZW0uc2V0VGV4dCggUmVzb3VyY2VzLmRldGFpbHNUYWJMYWJlbCApOwotCi0gICAgICAgIHRoaXMucnVudGltZXNQYW5lbCA9IG5ldyBSdW50aW1lc1BhbmVsKCB0YWJGb2xkZXIsIHRoaXMuZnBqd2MgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lc1RhYkl0ZW0gPSBuZXcgVGFiSXRlbSggdGFiRm9sZGVyLCBTV1QuTlVMTCApOwotICAgICAgICB0aGlzLnJ1bnRpbWVzVGFiSXRlbS5zZXRDb250cm9sKCB0aGlzLnJ1bnRpbWVzUGFuZWwgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lc1RhYkl0ZW0uc2V0VGV4dCggUmVzb3VyY2VzLnJ1bnRpbWVzVGFiTGFiZWwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucnVudGltZXNQYW5lbC5hZGRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBTV1QuUmVzaXplLAotICAgICAgICAgICAgbmV3IExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gd2VpZ2h0cyA9IEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuc2Zvcm0xLmdldFdlaWdodHMoKTsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRzU2VsZWN0aW9uUGFuZWwudGhpcy5zZXR0aW5ncy5wdXQoIFNBU0gxVzEsIHdlaWdodHNbIDAgXSApOwotICAgICAgICAgICAgICAgICAgICBGYWNldHNTZWxlY3Rpb25QYW5lbC50aGlzLnNldHRpbmdzLnB1dCggU0FTSDFXMiwgd2VpZ2h0c1sgMSBdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotCi0gICAgICAgIHRoaXMucHJvYmxlbXNWaWV3ID0gbmV3IFRhYmxlVmlld2VyKCB0aGlzLnNmb3JtMSwgU1dULkJPUkRFUiApOwotICAgICAgICB0aGlzLnByb2JsZW1zVmlldy5zZXRDb250ZW50UHJvdmlkZXIoIG5ldyBQcm9ibGVtc0NvbnRlbnRQcm92aWRlcigpICk7Ci0gICAgICAgIHRoaXMucHJvYmxlbXNWaWV3LnNldExhYmVsUHJvdmlkZXIoIG5ldyBQcm9ibGVtc0xhYmVsUHJvdmlkZXIoKSApOwotICAgICAgICB0aGlzLnByb2JsZW1zVmlldy5zZXRJbnB1dCggbmV3IE9iamVjdCgpICk7Ci0KLSAgICAgICAgdGhpcy5wcm9ibGVtc1ZpZXcuZ2V0VGFibGUoKS5hZGRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBTV1QuUmVzaXplLAotICAgICAgICAgICAgbmV3IExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gd2VpZ2h0cyA9IEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuc2Zvcm0yLmdldFdlaWdodHMoKTsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRzU2VsZWN0aW9uUGFuZWwudGhpcy5zZXR0aW5ncy5wdXQoIFNBU0gyVzEsIHdlaWdodHNbIDAgXSApOwotICAgICAgICAgICAgICAgICAgICBGYWNldHNTZWxlY3Rpb25QYW5lbC50aGlzLnNldHRpbmdzLnB1dCggU0FTSDJXMiwgd2VpZ2h0c1sgMSBdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3MuZ2V0KCBTQVNIMVcxICkgPT0gbnVsbCApIHRoaXMuc2V0dGluZ3MucHV0KCBTQVNIMVcxLCA3MCApOwotICAgICAgICBpZiggdGhpcy5zZXR0aW5ncy5nZXQoIFNBU0gxVzIgKSA9PSBudWxsICkgdGhpcy5zZXR0aW5ncy5wdXQoIFNBU0gxVzIsIDMwICk7Ci0gICAgICAgIGlmKCB0aGlzLnNldHRpbmdzLmdldCggU0FTSDJXMSApID09IG51bGwgKSB0aGlzLnNldHRpbmdzLnB1dCggU0FTSDJXMSwgNjAgKTsKLSAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3MuZ2V0KCBTQVNIMlcyICkgPT0gbnVsbCApIHRoaXMuc2V0dGluZ3MucHV0KCBTQVNIMlcyLCA0MCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgaW50W10gd2VpZ2h0czEKLSAgICAgICAgICAgID0gbmV3IGludFtdIHsgdGhpcy5zZXR0aW5ncy5nZXRJbnQoIFNBU0gxVzEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5nZXRJbnQoIFNBU0gxVzIgKSB9OwotCi0gICAgICAgIHRoaXMuc2Zvcm0xLnNldFdlaWdodHMoIHdlaWdodHMxICk7Ci0KLSAgICAgICAgZmluYWwgaW50W10gd2VpZ2h0czIKLSAgICAgICAgICAgID0gbmV3IGludFtdIHsgdGhpcy5zZXR0aW5ncy5nZXRJbnQoIFNBU0gyVzEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5nZXRJbnQoIFNBU0gyVzIgKSB9OwotCi0gICAgICAgIHRoaXMuc2Zvcm0yLnNldFdlaWdodHMoIHdlaWdodHMyICk7Ci0gICAgICAgIAotICAgICAgICBhZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IERpc3Bvc2VMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoIGZpbmFsIERpc3Bvc2VFdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc3Bvc2VFdmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoIHBhcmVudCApOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0dXAgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIuCi0gICAgICAgIAotICAgICAgICB0aGlzLnJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciA9IG5ldyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZVZhbGlkYXRpb25Qcm9ibGVtc0NoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgUnVudGltZU1hbmFnZXIuYWRkTGlzdGVuZXIoIHRoaXMucnVudGltZUxpZmVjeWNsZUxpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS5WQUxJREFUSU9OX1NUQVRVU19DSEFOR0VEICk7Ci0gICAgICAgIAotICAgICAgICAvLyBCaW5kIHRvIHRoZSBtb2RlbC4KLSAgICAgICAgCi0gICAgICAgIGFkZFdvcmtpbmdDb3B5TGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX0ZBQ0VUU19DSEFOR0VECi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBoYW5kbGVQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50KCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhZGRXb3JraW5nQ29weUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVZhbGlkYXRpb25Qcm9ibGVtc0NoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlZBTElEQVRJT05fUFJPQkxFTVNfQ0hBTkdFRCwKLSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRAotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgaGFuZGxlVmFsaWRhdGlvblByb2JsZW1zQ2hhbmdlZEV2ZW50KCk7Ci0gICAgICAgIAotICAgICAgICBhZGRXb3JraW5nQ29weUxpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RlZFByZXNldENoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlNFTEVDVEVEX1BSRVNFVF9DSEFOR0VECi0gICAgICAgICk7Ci0KLSAgICAgICAgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQuc3luY1dpdGhQcmVzZXRzTW9kZWwoIHRoaXMuZnBqd2MsIHRoaXMucHJlc2V0c0NvbWJvICk7Ci0gICAgICAgIAotICAgICAgICBhZGRXb3JraW5nQ29weUxpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb2RlbENoYW5nZWRFdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5GSVhFRF9GQUNFVFNfQ0hBTkdFRCwgCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlNFTEVDVEVEX1BSRVNFVF9DSEFOR0VELAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VECi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhYmxlLgotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMudHJlZS5nZXRJdGVtQ291bnQoKSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBUcmVlSXRlbSBmaXJzdEl0ZW0gPSB0aGlzLnRyZWUuZ2V0SXRlbSggMCApOwotICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldFNlbGVjdGlvbiggbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oIGZpcnN0SXRlbS5nZXREYXRhKCkgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZnBqd2M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0aW9uVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggdGhpcy5mcGp3Yy52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNldEZvY3VzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciggZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLnNlbGVjdGlvbkxpc3RlbmVycy5hZGQoIGxpc3RlbmVyICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc2VsZWN0aW9uICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oIHRoaXMuc2VsZWN0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oIG5ldyBPYmplY3RbIDAgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycygpCi0gICAgewotICAgICAgICBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KCB0aGlzLCBnZXRTZWxlY3Rpb24oKSApOwotCi0gICAgICAgIGZvciggSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uTGlzdGVuZXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZCggZXZlbnQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pbWFnZVJlZ2lzdHJ5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3dEZWNvcmF0aW9ucyApCi0gICAgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzRml4ZWQgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuaXNGaXhlZFByb2plY3RGYWNldCggZmFjZXQgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gKCBpc0ZpeGVkICYmIHNob3dEZWNvcmF0aW9ucyA/ICJGOiIgOiAiZjoiICkgKyBmYWNldC5nZXRJZCgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgCi0gICAgICAgIEltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCggaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpbWFnZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSURlY29yYXRpb25zUHJvdmlkZXIgZGVjcHJvdgotICAgICAgICAgICAgICAgID0gKElEZWNvcmF0aW9uc1Byb3ZpZGVyKSBmYWNldC5nZXRBZGFwdGVyKCBJRGVjb3JhdGlvbnNQcm92aWRlci5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1nZGVzYyA9IGRlY3Byb3YuZ2V0SWNvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggaXNGaXhlZCAmJiBzaG93RGVjb3JhdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltZ2Rlc2MgPSBuZXcgRml4ZWRGYWNldEltYWdlRGVzY3JpcHRvciggaW1nZGVzYyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KCBpZCwgaW1nZGVzYyApOwotICAgICAgICAgICAgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KCBpZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSAiYzoiICsgY2F0ZWdvcnkuZ2V0SWQoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGltYWdlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRGVjb3JhdGlvbnNQcm92aWRlciBkZWNwcm92Ci0gICAgICAgICAgICAgICAgPSAoSURlY29yYXRpb25zUHJvdmlkZXIpIGNhdGVnb3J5LmdldEFkYXB0ZXIoIElEZWNvcmF0aW9uc1Byb3ZpZGVyLmNsYXNzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEltYWdlRGVzY3JpcHRvciBpbWdkZXNjID0gZGVjcHJvdi5nZXRJY29uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEltYWdlUmVnaXN0cnkoKS5wdXQoIGlkLCBpbWdkZXNjICk7Ci0gICAgICAgICAgICBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoIGlkICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkKLSAgICB7Ci0gICAgICAgIC8vIFNvbWVob3cgdGhlIGNoZWNrZWQgc3RhdGUgb2YgbmVzdGVkIGl0ZW1zIGdldHMgbG9zdCB3aGVuIGEgcmVmcmVzaAotICAgICAgICAvLyBpcyBwZXJmb3JtZWQsIHNvIHdlIGhhdmUgdG8gZG8gdGhpcyB3b3JrYXJvdW5kLgotICAgICAgICAKLSAgICAgICAgZmluYWwgT2JqZWN0W10gY2hlY2tlZCA9IHRoaXMudHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAgICAgdGhpcy50cmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyggY2hlY2tlZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUV4cGFuZGVkU3RhdGUoIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhwYW5kZWQgKQotICAgIHsKLSAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoIGNhdGVnb3J5LCBleHBhbmRlZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93VG9vbFRpcHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1Rvb2xUaXBzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTaG93VG9vbFRpcHMoIGZpbmFsIGJvb2xlYW4gc2hvd1Rvb2xUaXBzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2hvd1Rvb2xUaXBzID0gc2hvd1Rvb2xUaXBzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENhdGVnb3J5U3RhdGUoIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSApCi0gICAgewotICAgICAgICBpZiggY2F0ZWdvcnkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGF2YWlsYWJsZSA9IDA7Ci0gICAgICAgIGludCBzZWxlY3RlZCA9IDA7Ci0KLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBjYXRlZ29yeS5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5mcGp3Yy5pc0ZhY2V0QXZhaWxhYmxlKCBmICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2YWlsYWJsZSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5mcGp3Yy5oYXNQcm9qZWN0RmFjZXQoIGYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBzZWxlY3RlZCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldENoZWNrZWQoIGNhdGVnb3J5LCBmYWxzZSApOwotICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldEdyYXllZCggY2F0ZWdvcnksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggc2VsZWN0ZWQgPT0gYXZhaWxhYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldENoZWNrZWQoIGNhdGVnb3J5LCB0cnVlICk7Ci0gICAgICAgICAgICB0aGlzLnRyZWVWaWV3ZXIuc2V0R3JheWVkKCBjYXRlZ29yeSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudHJlZVZpZXdlci5zZXRHcmF5Q2hlY2tlZCggY2F0ZWdvcnksIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkV29ya2luZ0NvcHlMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgICAgIHRoaXMucmVnaXN0ZXJlZFdvcmtpbmdDb3B5TGlzdGVuZXJzLmFkZCggbGlzdGVuZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3RGYWNldCBnZXRTZWxlY3RlZFByb2plY3RGYWNldCgpCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGdldFNlbGVjdGVkUHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAKLSAgICAgICAgaWYoIGZ2ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnNlbGVjdGlvbiAhPSBudWxsICYmIHRoaXMuc2VsZWN0aW9uIGluc3RhbmNlb2YgSVByb2plY3RGYWNldFZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSB0aGlzLnNlbGVjdGlvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0U2VsZWN0ZWRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhdmFpbGFibGVWZXJzaW9ucyA9IHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIGYgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBhdmFpbGFibGVWZXJzaW9ucy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHNlbGVjdGVkVmVyc2lvbiA9IHRoaXMuZnBqd2MuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggZiApOwotICAgICAgICAKLSAgICAgICAgaWYoIHNlbGVjdGVkVmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRWZXJzaW9uID0gdGhpcy5zZWxlY3RlZFZlcnNpb25zLmdldCggZiApOwotCi0gICAgICAgICAgICBpZiggc2VsZWN0ZWRWZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkVmVyc2lvbiA9IGYuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgYXZhaWxhYmxlVmVyc2lvbnMuY29udGFpbnMoIHNlbGVjdGVkVmVyc2lvbiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFZlcnNpb24gPSB0aGlzLmZwandjLmdldEhpZ2hlc3RBdmFpbGFibGVWZXJzaW9uKCBmICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuc2VsZWN0ZWRWZXJzaW9ucy5wdXQoIGYsIHNlbGVjdGVkVmVyc2lvbiApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkVmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVmVyc2lvbiggZmluYWwgSVByb2plY3RGYWNldCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmZwandjLmdldFByb2plY3RGYWNldFZlcnNpb24oIGYgKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGp3Yy5jaGFuZ2VQcm9qZWN0RmFjZXRWZXJzaW9uKCBmdiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNlbGVjdGVkVmVyc2lvbnMucHV0KCBmLCBmdiApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gdGhpcy5nZXRTZWxlY3RlZFByb2plY3RGYWNldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBmdjsKLSAgICAgICAgICAgIG5vdGlmeVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoIChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy50cmVlVmlld2VyLmdldFNlbGVjdGlvbigpICkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYoIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb24gPSBnZXRTZWxlY3RlZFZlcnNpb24oIChJUHJvamVjdEZhY2V0ICkgc2VsZWN0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBzZWxlY3Rpb24gIT0gdGhpcy5zZWxlY3Rpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotICAgICAgICAgICAgbm90aWZ5U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycygpOwotICAgICAgICAgICAgdXBkYXRlUG9wdXBNZW51KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrU3RhdGVDaGFuZ2VkKCBmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBlbCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIGVsIGluc3RhbmNlb2YgSVByb2plY3RGYWNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBlbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMuZnBqd2MuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnMoIGYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgY2hlY2tlZCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVWaWV3ZXIuc2V0Q2hlY2tlZCggZWwsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuY291bGROb3REZXNlbGVjdEZpeGVkRmFjZXRNZXNzYWdlLCBmLmdldExhYmVsKCkgKTsgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRGYWNldFRvb2xUaXAuc2V0TWVzc2FnZSggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCBjdXJzb3JMb2NhdGlvbiA9IGdldERpc3BsYXkoKS5nZXRDdXJzb3JMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmZpeGVkRmFjZXRUb29sVGlwLnNob3coIHRoaXMudHJlZS50b0NvbnRyb2woIGN1cnNvckxvY2F0aW9uICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hlY2tlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5mcGp3Yy5hZGRQcm9qZWN0RmFjZXQoIGdldFNlbGVjdGVkVmVyc2lvbiggZiApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5mcGp3Yy5yZW1vdmVQcm9qZWN0RmFjZXQoIGYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVmcmVzaENhdGVnb3J5U3RhdGUoIGYuZ2V0Q2F0ZWdvcnkoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyIGNwCi0gICAgICAgICAgICAgICAgPSAoQ29udGVudFByb3ZpZGVyKSB0aGlzLnRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzCi0gICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oIHRoaXMuZnBqd2MuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKCBlbCApOwotICAgICAgICAgICAgaW50IHNlbGVjdGVkID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBPYmplY3QgY2hpbGQgOiBjaGlsZHJlbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKElQcm9qZWN0RmFjZXQpIGNoaWxkOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMuZnBqd2MuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnMoIGYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGdldFNlbGVjdGVkVmVyc2lvbiggZiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoZWNrZWQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzLnJlbW92ZSggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldENoZWNrZWQoIGYsIGNoZWNrZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHRoaXMuZnBqd2MuaGFzUHJvamVjdEZhY2V0KCBmICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzZWxlY3RlZCA9PSAwIHx8IHNlbGVjdGVkID09IGNoaWxkcmVuLmxlbmd0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldEdyYXllZCggZWwsIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldEdyYXlDaGVja2VkKCBlbCwgdHJ1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmZwandjLnNldFByb2plY3RGYWNldHMoIGZhY2V0cyApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5mcGp3Yy5zZXRTZWxlY3RlZFByZXNldCggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdXBkYXRlUG9wdXBNZW51KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlRG93bkV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBoYW5kbGVNb3VzZURvd25FdmVudEhlbHBlciggZXZlbnQsIHRoaXMudHJlZS5nZXRJdGVtcygpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNb3VzZURvd25FdmVudEhlbHBlciggZmluYWwgRXZlbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlSXRlbVtdIGl0ZW1zICkKLSAgICB7Ci0gICAgICAgIGZvciggVHJlZUl0ZW0gaXRlbSA6IGl0ZW1zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGl0ZW0uZ2V0Qm91bmRzKCAxICkuY29udGFpbnMoIGV2ZW50LngsIGV2ZW50LnkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVHJlZUl0ZW1bXSBuZXdTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bXSB7IGl0ZW0gfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBBcnJheXMuZXF1YWxzKCB0aGlzLnRyZWUuZ2V0U2VsZWN0aW9uKCksIG5ld1NlbGVjdGlvbiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZS5zZXRTZWxlY3Rpb24oIG5ldyBUcmVlSXRlbVtdIHsgaXRlbSB9ICk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZVZpZXdlci5lZGl0RWxlbWVudCggaXRlbS5nZXREYXRhKCksIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBoYW5kbGVNb3VzZURvd25FdmVudEhlbHBlciggZXZlbnQsIGl0ZW0uZ2V0SXRlbXMoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFpbnRJdGVtRXZlbnQoIGZpbmFsIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgIGZpbmFsIE9iamVjdCBpdGVtRGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCi0gICAgICAgIGlmKCBpdGVtRGF0YSBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXQgJiYgZXZlbnQuaW5kZXggPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBpdGVtRGF0YTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIGYgKS5zaXplKCkgPiAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbWFnZSBhcnJvd0ltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCggSU1HX0RPV05fQVJST1cgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZWN0YW5nbGUgYXJyb3dJbWFnZUJvdW5kcyA9IGFycm93SW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbldpZHRoID0gdGhpcy5jb2xWZXJzaW9uLmdldENvbHVtbigpLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1IZWlnaHQgPSB0aGlzLnRyZWUuZ2V0SXRlbUhlaWdodCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCB4LCB5OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHggPSBldmVudC54ICsgY29sdW1uV2lkdGggLSBhcnJvd0ltYWdlQm91bmRzLndpZHRoIC0gMTA7Ci0gICAgICAgICAgICAgICAgeSA9IGV2ZW50Lnk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZ2MuZmlsbFJlY3RhbmdsZSggeCwgeSwgYXJyb3dJbWFnZUJvdW5kcy53aWR0aCArIDEwLCBpdGVtSGVpZ2h0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgeSA9IGV2ZW50LnkgKyAoIGl0ZW1IZWlnaHQgLSBhcnJvd0ltYWdlQm91bmRzLmhlaWdodCApIC8gMjsKLSAgICAgICAgICAgICAgICBldmVudC5nYy5kcmF3SW1hZ2UoIGFycm93SW1hZ2UsIHgsIHkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGlzcG9zZUV2ZW50KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW1hZ2VSZWdpc3RyeS5kaXNwb3NlKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZWdpc3RlcmVkV29ya2luZ0NvcHlMaXN0ZW5lcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwandjLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBSdW50aW1lTWFuYWdlci5yZW1vdmVMaXN0ZW5lciggdGhpcy5ydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNhdmVQcmVzZXQoKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSB0aGlzLmZwandjLmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSBTYXZlUHJlc2V0RGlhbG9nLnNob3dEaWFsb2coIGdldFNoZWxsKCksIGZhY2V0cyApOwotICAgICAgICAKLSAgICAgICAgaWYoIHByZXNldCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGp3Yy5zZXRTZWxlY3RlZFByZXNldCggcHJlc2V0LmdldElkKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlUHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gdGhpcy5mcGp3Yy5nZXRTZWxlY3RlZFByZXNldCgpOwotICAgICAgICB0aGlzLmZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBudWxsICk7Ci0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLmRlbGV0ZVByZXNldCggcHJlc2V0ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SUNhdGVnb3J5PiBhZmZlY3RlZENhdGVnb3JpZXMgPSBuZXcgSGFzaFNldDxJQ2F0ZWdvcnk+KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggZXZlbnQgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gZXZlbnQuZ2V0V29ya2luZ0NvcHkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQgZXZ0Ci0gICAgICAgICAgICAgICAgPSAoSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQpIGV2ZW50OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZXZ0LmdldEFsbEFmZmVjdGVkRmFjZXRzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja2VkID0gZnBqd2MuaGFzUHJvamVjdEZhY2V0KCBmdiApOwotICAgICAgICAgICAgICAgIHRoaXMudHJlZVZpZXdlci5zZXRDaGVja2VkKCBmLCBjaGVja2VkICk7Ci0gICAgICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnVwZGF0ZSggZiwgbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSA9IGYuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2F0ZWdvcnkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZENhdGVnb3JpZXMuYWRkKCBjYXRlZ29yeSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SVByb2plY3RGYWNldD4gZmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mcGp3Yy5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2V0cy5hZGQoIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMudHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoIGZhY2V0cy50b0FycmF5KCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGZhY2V0IDogdGhpcy5mcGp3Yy5nZXRBdmFpbGFibGVGYWNldHMoKS5rZXlTZXQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNhdGVnb3J5IGNhdGVnb3J5ID0gZmFjZXQuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2F0ZWdvcnkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZENhdGVnb3JpZXMuYWRkKCBjYXRlZ29yeSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy50cmVlVmlld2VyLnVwZGF0ZSggdGhpcy5mcGp3Yy5nZXRBdmFpbGFibGVGYWNldHMoKS5rZXlTZXQoKS50b0FycmF5KCksIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNhdGVnb3J5IGNhdGVnb3J5IDogYWZmZWN0ZWRDYXRlZ29yaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVmcmVzaENhdGVnb3J5U3RhdGUoIGNhdGVnb3J5ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbGlkYXRpb25Qcm9ibGVtc0NoYW5nZWRFdmVudCgpCi0gICAgewotICAgICAgICBpZiggISBUaHJlYWQuY3VycmVudFRocmVhZCgpLmVxdWFscyggZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSB1aVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmFsaWRhdGlvblByb2JsZW1zQ2hhbmdlZEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggdWlSdW5uYWJsZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMucHJvYmxlbXNWaWV3LnJlZnJlc2goKTsKLQotICAgICAgICBpZiggZ2V0RmlsdGVyZWRQcm9ibGVtcygpLmxlbmd0aCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuc2Zvcm0xLmdldE1heGltaXplZENvbnRyb2woKSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNmb3JtMS5zZXRNYXhpbWl6ZWRDb250cm9sKCB0aGlzLnNmb3JtMiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuc2Zvcm0xLmdldE1heGltaXplZENvbnRyb2woKSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNmb3JtMS5zZXRNYXhpbWl6ZWRDb250cm9sKCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGVkUHJlc2V0Q2hhbmdlZEV2ZW50KCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gdGhpcy5mcGp3Yy5nZXRTZWxlY3RlZFByZXNldCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIHByZXNldCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zYXZlUHJlc2V0QnV0dG9uLnNldEVuYWJsZWQoIHRydWUgKTsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJlc2V0QnV0dG9uLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNhdmVQcmVzZXRCdXR0b24uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJlc2V0QnV0dG9uLnNldEVuYWJsZWQoIHByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLlVTRVJfREVGSU5FRCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RlbENoYW5nZWRFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBldmVudC5nZXRUeXBlKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJWEVEX0ZBQ0VUU19DSEFOR0VEOgotICAgICAgICAgICAgY2FzZSBUQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcnVuT25EaXNwbGF5VGhyZWFkKCBnZXREaXNwbGF5KCksIHJ1bm5hYmxlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZVZlcnNpb25NZW51U2VsZWN0ZWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXQoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBnZXRTZWxlY3RlZFZlcnNpb24oIGYgKTsKLSAgICAgICAgZmluYWwgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXJzaW9ucyA9IHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIGYgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIG5ld1ZlcnNpb24KLSAgICAgICAgICAgID0gQ2hhbmdlRmFjZXRWZXJzaW9uRGlhbG9nLnNob3dEaWFsb2coIGdldFNoZWxsKCksIGYsIGZ2LCB2ZXJzaW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgIGlmKCBuZXdWZXJzaW9uICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwandjLmNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oIG5ld1ZlcnNpb24gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRmFjZXRMb2NrVW5sb2NrKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGdldFNlbGVjdGVkUHJvamVjdEZhY2V0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgCi0gICAgICAgICAgICA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCB0aGlzLmZwandjLmdldEZpeGVkUHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZml4ZWRGYWNldHMuY29udGFpbnMoIGYgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpeGVkRmFjZXRzLnJlbW92ZSggZiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZml4ZWRGYWNldHMuYWRkKCBmICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnBqd2Muc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBmaXhlZEZhY2V0cyApOwotICAgICAgICAKLSAgICAgICAgdXBkYXRlUG9wdXBNZW51KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQb3B1cE1lbnUoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc2VsZWN0aW9uIGluc3RhbmNlb2YgSVByb2plY3RGYWNldFZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnRyZWUuc2V0TWVudSggdGhpcy5wb3B1cE1lbnUgKTsKLQotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKCAoSVByb2plY3RGYWNldFZlcnNpb24pIHRoaXMuc2VsZWN0aW9uICkuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLmZwandjLmlzRml4ZWRQcm9qZWN0RmFjZXQoIGYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb3B1cE1lbnVMb2NrVW5sb2NrLnNldFRleHQoIFJlc291cmNlcy51bmxvY2tNZW51SXRlbSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucG9wdXBNZW51TG9ja1VubG9jay5zZXRUZXh0KCBSZXNvdXJjZXMubG9ja01lbnVJdGVtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMucG9wdXBNZW51TG9ja1VubG9jay5zZXRFbmFibGVkKCB0aGlzLmZwandjLmhhc1Byb2plY3RGYWNldCggZiApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBudW1BdmFpbGFibGVWZXJzaW9ucyA9IHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIGYgKS5zaXplKCk7Ci0gICAgICAgICAgICB0aGlzLnBvcHVwTWVudUNoYW5nZVZlcnNpb24uc2V0RW5hYmxlZCggbnVtQXZhaWxhYmxlVmVyc2lvbnMgPiAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnRyZWUuc2V0TWVudSggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVHJlZUl0ZW0gZ2V0VHJlZUl0ZW0oIGZpbmFsIGludCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRUcmVlSXRlbUhlbHBlciggeCwgeSwgdGhpcy50cmVlLmdldEl0ZW1zKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgVHJlZUl0ZW0gZ2V0VHJlZUl0ZW1IZWxwZXIoIGZpbmFsIGludCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZUl0ZW1bXSBpdGVtcyApCi0gICAgewotICAgICAgICBmb3IoIFRyZWVJdGVtIGl0ZW0gOiBpdGVtcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpdGVtLmdldEJvdW5kcygpLmNvbnRhaW5zKCB4LCB5ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBUcmVlSXRlbSByZXMgPSBnZXRUcmVlSXRlbUhlbHBlciggeCwgeSwgaXRlbS5nZXRJdGVtcygpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCByZXMgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNvbXB1dGVEZWZhdWx0RmFjZXRDb2x1bW5XaWR0aCgpCi0gICAgewotICAgICAgICBmaW5hbCBHQyBnYyA9IG5ldyBHQyggdGhpcy5nZXREaXNwbGF5KCkgKTsKLSAgICAgICAgaW50IG1heEZhY2V0TGFiZWxXaWR0aCA9IDA7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2Muc2V0Rm9udCggdGhpcy50cmVlLmdldEZvbnQoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4RmFjZXRMYWJlbFdpZHRoID0gbWF4KCBtYXhGYWNldExhYmVsV2lkdGgsIGdjLnRleHRFeHRlbnQoIGYuZ2V0TGFiZWwoKSApLnggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1heCggbWF4RmFjZXRMYWJlbFdpZHRoICsgMTAwLCAyMDAgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb21wdXRlRGVmYXVsdFZlcnNpb25Db2x1bW5XaWR0aCgpCi0gICAgewotICAgICAgICBmaW5hbCBHQyBnYyA9IG5ldyBHQyggdGhpcy5nZXREaXNwbGF5KCkgKTsKLSAgICAgICAgaW50IG1heFZlcnNpb25TdHJpbmdXaWR0aCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBjb2x1bW5MYWJlbFdpZHRoOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdjLnNldEZvbnQoIHRoaXMudHJlZS5nZXRGb250KCkgKTsKLQotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmLmdldFZlcnNpb25zKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRleHRFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKS54OwotICAgICAgICAgICAgICAgICAgICBtYXhWZXJzaW9uU3RyaW5nV2lkdGggPSBtYXgoIG1heFZlcnNpb25TdHJpbmdXaWR0aCwgdGV4dEV4dGVudCArIDMwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb2x1bW5MYWJlbFdpZHRoID0gZ2MudGV4dEV4dGVudCggUmVzb3VyY2VzLnZlcnNpb25Db2x1bW5MYWJlbCApLnggKyAzMDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1heCggbWF4VmVyc2lvblN0cmluZ1dpZHRoLCBjb2x1bW5MYWJlbFdpZHRoICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVN0YXR1c1tdIGdldEZpbHRlcmVkUHJvYmxlbXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgSVN0YXR1c1tdIHVuZmlsdGVyZWQgPSB0aGlzLmZwandjLnZhbGlkYXRlKCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgYm9vbGVhbiBzb21ldGhpbmdUb1JlbW92ZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJU3RhdHVzIHN0IDogdW5maWx0ZXJlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBzdC5nZXRDb2RlKCkgPT0gSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuUFJPQkxFTV9QUk9KRUNUX05BTUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvbWV0aGluZ1RvUmVtb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgc29tZXRoaW5nVG9SZW1vdmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdW5maWx0ZXJlZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJU3RhdHVzPiBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVN0YXR1cyBzdCA6IHVuZmlsdGVyZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggc3QuZ2V0Q29kZSgpICE9IElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LlBST0JMRU1fUFJPSkVDVF9OQU1FICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hZGQoIHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmaWx0ZXJlZC50b0FycmF5KCBuZXcgSVN0YXR1c1sgZmlsdGVyZWQuc2l6ZSgpIF0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRlbnRQcm92aWRlcgotCi0gICAgICAgIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLQotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJQ2F0ZWdvcnk+IGNhdGVnb3JpZXMgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yaWVzKCk7Ci0KLSAgICAgICAgICAgIGZvciggSUNhdGVnb3J5IGNhdCA6IGNhdGVnb3JpZXMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBjYXQuZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIGZwandjLmdldEF2YWlsYWJsZVZlcnNpb25zKCBmICkuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB2aXNpYmxlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBjYXQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PElQcm9qZWN0RmFjZXQsU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPj4gZW50cnkgCi0gICAgICAgICAgICAgICAgIDogZnBqd2MuZ2V0QXZhaWxhYmxlRmFjZXRzKCkuZW50cnlTZXQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhdmFpbGFibGVWZXJzaW9ucyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGYuZ2V0Q2F0ZWdvcnkoKSA9PSBudWxsICYmICEgYXZhaWxhYmxlVmVyc2lvbnMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBmICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oIGZpbmFsIE9iamVjdCBwYXJlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcGFyZW50IGluc3RhbmNlb2YgSUNhdGVnb3J5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoSUNhdGVnb3J5KSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUHJvamVjdEZhY2V0PiBmYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGNhdGVnb3J5LmdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISBmcGp3Yy5nZXRBdmFpbGFibGVWZXJzaW9ucyggZiApLmlzRW1wdHkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cy5hZGQoIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBmYWNldHMudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WyAwIF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudCggZmluYWwgT2JqZWN0IGVsZW1lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBmLmdldENhdGVnb3J5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbiggZmluYWwgT2JqZWN0IGVsZW1lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCBlbGVtZW50IGluc3RhbmNlb2YgSUNhdGVnb3J5ICkgJiYKLSAgICAgICAgICAgICAgICAgICAhICggKElDYXRlZ29yeSkgZWxlbWVudCApLmdldFByb2plY3RGYWNldHMoKS5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKCBmaW5hbCBWaWV3ZXIgdmlld2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvbGRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5ld09iamVjdCApIHt9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGYWNldENvbHVtbkxhYmVsUHJvdmlkZXIKLQotICAgICAgICBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIKLSAgICAKLSAgICB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoIGZpbmFsIE9iamVjdCBlbGVtZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0ZWdvcnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoIChJQ2F0ZWdvcnkpIGVsZW1lbnQgKS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoIChJUHJvamVjdEZhY2V0KSBlbGVtZW50ICkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3RGYWNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuZ2V0SW1hZ2UoIChJUHJvamVjdEZhY2V0KSBlbGVtZW50LCB0cnVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMuZ2V0SW1hZ2UoIChJQ2F0ZWdvcnkpIGVsZW1lbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRmFjZXRWZXJzaW9uQ29sdW1uTGFiZWxQcm92aWRlcgotCi0gICAgICAgIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlcgotCi0gICAgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3RGYWNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSAoUHJvamVjdEZhY2V0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGYuaXNWZXJzaW9uSGlkZGVuKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdGVkVmVyc2lvbiggZiApLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGYWNldFZlcnNpb25Db2x1bW5FZGl0aW5nU3VwcG9ydAotCi0gICAgICAgIGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQKLSAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVhZE9ubHlDb21ib0JveENlbGxFZGl0b3IgY2VkaXRvcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YzsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBGYWNldFZlcnNpb25Db2x1bW5FZGl0aW5nU3VwcG9ydCggZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHRyZWVWaWV3ZXIgKTsKLSAgICAgICAgICAgIHRoaXMuY2VkaXRvciA9IG5ldyBSZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvciggdHJlZVZpZXdlci5nZXRUcmVlKCksIG5ldyBTdHJpbmdbIDAgXSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgICAgIHRoaXMuZnBqd2MgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FZGl0KCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3RGYWNldCAmJgotICAgICAgICAgICAgICAgICAgIHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIChJUHJvamVjdEZhY2V0ICkgZWxlbWVudCApLnNpemUoKSA+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBlbGVtZW50OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZiA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmVyc2lvbnMgPSB0aGlzLmZwandjLmdldEF2YWlsYWJsZVZlcnNpb25zKCBmICk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB2ZXJzdHJzID0gbmV3IFN0cmluZ1sgdmVyc2lvbnMuc2l6ZSgpIF07Ci0gICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdmVyc2lvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZlcnN0cnNbIGkgXSA9IGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZnYgPT0gZ2V0U2VsZWN0ZWRWZXJzaW9uKCBmICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgSW50ZWdlciggaSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuY2VkaXRvci5zZXRJdGVtcyggdmVyc3RycyApOwotICAgICAgICAgICAgdGhpcy5jZWRpdG9yLnNldFZhbHVlKCB2YWx1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5jZWRpdG9yOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBlbGVtZW50OwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mcGp3Yy5nZXRBdmFpbGFibGVWZXJzaW9ucyggZiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZnYgPT0gZ2V0U2VsZWN0ZWRWZXJzaW9uKCBmICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKCBpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKCBmaW5hbCBPYmplY3QgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBlbGVtZW50OwotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gKCAoSW50ZWdlcikgdmFsdWUgKS5pbnRWYWx1ZSgpOwotICAgIAotICAgICAgICAgICAgaWYoIGluZGV4ICE9IC0xICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoIGYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSBpbmRleCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkVmVyc2lvbiggZiwgZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0c1NlbGVjdGlvblBhbmVsLnRoaXMudHJlZVZpZXdlci51cGRhdGUoIGYsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRml4ZWRGYWNldEltYWdlRGVzY3JpcHRvciAKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJMQVlfSU1HX0xPQ0FUSU9OCi0gICAgICAgICAgICA9ICJpbWFnZXMvbG9jay5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURhdGEgT1ZFUkxBWQotICAgICAgICAgICAgPSBGYWNldFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvciggT1ZFUkxBWV9JTUdfTE9DQVRJT04gKS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZmluYWwgSW1hZ2VEYXRhIGJhc2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUG9pbnQgc2l6ZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBGaXhlZEZhY2V0SW1hZ2VEZXNjcmlwdG9yKCBmaW5hbCBJbWFnZURlc2NyaXB0b3IgYmFzZSApIAotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJhc2UgPSBiYXNlLmdldEltYWdlRGF0YSgpOwotICAgICAgICAgICAgdGhpcy5zaXplID0gbmV3IFBvaW50KCB0aGlzLmJhc2Uud2lkdGgsIHRoaXMuYmFzZS5oZWlnaHQgKTsgCi0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoIGZpbmFsIGludCB3aWR0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCApIAotICAgICAgICB7Ci0gICAgICAgICAgICBkcmF3SW1hZ2UoIHRoaXMuYmFzZSwgMCwgMCApOwotICAgICAgICAgICAgZHJhd0ltYWdlKCBPVkVSTEFZLCAwLCBoZWlnaHQgLSBPVkVSTEFZLmhlaWdodCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zaXplOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNvcnRlcgotCi0gICAgICAgIGV4dGVuZHMgVmlld2VyU29ydGVyCi0KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggZmluYWwgVmlld2VyIHZpZXdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYWJlbCggYSApLmNvbXBhcmVUb0lnbm9yZUNhc2UoIGdldExhYmVsKCBiICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYWJlbCggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKCAoSVByb2plY3RGYWNldCkgb2JqICkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKCAoSUNhdGVnb3J5KSBvYmogKS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRmFjZXRUb29sVGlwCi0gICAgCi0gICAgICAgIGV4dGVuZHMgSGVhZGVyVG9vbFRpcAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBGYWNldFRvb2xUaXAoIGZpbmFsIENvbnRyb2wgY29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBjb250cm9sICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRDcmVhdGVUb29sVGlwKCBmaW5hbCBFdmVudCBldmVudCApIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZ2V0U2hvd1Rvb2xUaXBzKCkgPT0gZmFsc2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgVHJlZUl0ZW0gdHJlZUl0ZW0gPSBnZXRUcmVlSXRlbSggZXZlbnQueCwgZXZlbnQueSApOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRyZWVJdGVtICE9IG51bGwgJiYgdHJlZUl0ZW0uZ2V0Qm91bmRzKCAwICkuY29udGFpbnMoIGV2ZW50LngsIGV2ZW50LnkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHRyZWVJdGVtRGF0YSA9IHRyZWVJdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdHJlZUl0ZW1EYXRhIGluc3RhbmNlb2YgSVByb2plY3RGYWNldCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICggKElQcm9qZWN0RmFjZXQpIHRyZWVJdGVtRGF0YSApLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKCBkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRvb2xUaXBUaXRsZSggZmluYWwgRXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZ2V0VHJlZUl0ZW0oIGV2ZW50LngsIGV2ZW50LnkgKS5nZXREYXRhKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0ZWRWZXJzaW9uKCBmICkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRBcmVhKCBmaW5hbCBFdmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29tcG9zaXRlIHBhcmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBnbCggMSApICk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0QmFja2dyb3VuZCggZGlzcGxheS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5XUkFQICk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICAgICAgbGFiZWwuc2V0QmFja2dyb3VuZCggZGlzcGxheS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCApICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IChJUHJvamVjdEZhY2V0KSBnZXRUcmVlSXRlbSggZXZlbnQueCwgZXZlbnQueSApLmdldERhdGEoKTsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoIGYuZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYXRlZ29yeVRvb2xUaXAKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBIZWFkZXJUb29sVGlwCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIENhdGVnb3J5VG9vbFRpcCggZmluYWwgQ29udHJvbCBjb250cm9sICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIGNvbnRyb2wgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNob3VsZENyZWF0ZVRvb2xUaXAoIGZpbmFsIEV2ZW50IGV2ZW50ICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBnZXRTaG93VG9vbFRpcHMoKSA9PSBmYWxzZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSA9IGdldFRyZWVJdGVtKCBldmVudC54LCBldmVudC55ICk7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdHJlZUl0ZW0gIT0gbnVsbCAmJiB0cmVlSXRlbS5nZXRCb3VuZHMoIDAgKS5jb250YWlucyggZXZlbnQueCwgZXZlbnQueSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdHJlZUl0ZW1EYXRhID0gdHJlZUl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0cmVlSXRlbURhdGEgaW5zdGFuY2VvZiBJQ2F0ZWdvcnkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAoIChJQ2F0ZWdvcnkpIHRyZWVJdGVtRGF0YSApLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKCBkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDAgKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUb29sVGlwVGl0bGUoIGZpbmFsIEV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICggKElDYXRlZ29yeSkgZ2V0VHJlZUl0ZW0oIGV2ZW50LngsIGV2ZW50LnkgKS5nZXREYXRhKCkgKS5nZXRMYWJlbCgpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRBcmVhKCBmaW5hbCBFdmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29tcG9zaXRlIHBhcmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBnbCggMSApICk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0QmFja2dyb3VuZCggZGlzcGxheS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5XUkFQICk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICAgICAgbGFiZWwuc2V0QmFja2dyb3VuZCggZGlzcGxheS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCApICk7Ci0gICAgCi0gICAgICAgICAgICBmaW5hbCBJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoSUNhdGVnb3J5KSBnZXRUcmVlSXRlbSggZXZlbnQueCwgZXZlbnQueSApLmdldERhdGEoKTsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoIGNhdGVnb3J5LmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRml4ZWRGYWNldFRvb2xUaXAKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBCYXNpY1Rvb2xUaXAKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFLRV9FVkVOVF9UWVBFID0gLTk5OTk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRml4ZWRGYWNldFRvb2xUaXAoIGZpbmFsIENvbnRyb2wgY29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBjb250cm9sICk7Ci0gICAgICAgICAgICBzZXRQb3B1cERlbGF5KCAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3coIGZpbmFsIFBvaW50IGxvY2F0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIEpGYWNlIFRvb2xUaXAgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbHRlcm5hdGl2ZSBtZXRob2RzIG9mIHRvb2wgdGlwIGFjdGl2YXRpb24uCi0gICAgICAgICAgICAvLyBBbiBlbmhhbmNlbWVudCByZXF1ZXN0IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQ4NDQgdHJhY2tzCi0gICAgICAgICAgICAvLyB0aGlzIGlzc3VlLiBXaGVuIHRoYXQgZW5oYW5jZW1lbnQgcmVxdWVzdCBoYXMgYmVlbiByZXNvbHZlZCwgdGhpcyBoYWNreSAKLSAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBtb3JlIHNlbnNpYmxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBFdmVudCBmYWtlRXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICAgIGZha2VFdmVudC50eXBlID0gRkFLRV9FVkVOVF9UWVBFOwotICAgICAgICAgICAgZmFrZUV2ZW50LnggPSBsb2NhdGlvbi54OwotICAgICAgICAgICAgZmFrZUV2ZW50LnkgPSBsb2NhdGlvbi55OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgID0gVG9vbFRpcC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCggInRvb2xUaXBDcmVhdGUiLCBFdmVudC5jbGFzcyApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUoIHRydWUgKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKCB0aGlzLCBmYWtlRXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNob3VsZENyZWF0ZVRvb2xUaXAoIGZpbmFsIEV2ZW50IGV2ZW50ICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoIGV2ZW50LnR5cGUgPT0gRkFLRV9FVkVOVF9UWVBFICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9ibGVtc0NvbnRlbnRQcm92aWRlcgotCi0gICAgICAgIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLQotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRGaWx0ZXJlZFByb2JsZW1zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoIGZpbmFsIFZpZXdlciB2aWV3ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9sZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3T2JqZWN0ICkge30KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvYmxlbXNMYWJlbFByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dCggZmluYWwgT2JqZWN0IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoIChJU3RhdHVzKSBlbGVtZW50ICkuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKCBmaW5hbCBPYmplY3QgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29sdW1uICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltYWdlVHlwZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICggKElTdGF0dXMpIGVsZW1lbnQgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltYWdlVHlwZSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltYWdlVHlwZSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoIGltYWdlVHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KCBmaW5hbCBPYmplY3Qgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyICkge30KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgKSB7fQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXRzTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVCdXR0b25MYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQnV0dG9uTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVQcmVzZXREaWFsb2dUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZVByZXNldERpYWxvZ01lc3NhZ2U7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0Q29sdW1uTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25Db2x1bW5MYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGROb3REZXNlbGVjdEZpeGVkRmFjZXRNZXNzYWdlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxzVGFiTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVzVGFiTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2tNZW51SXRlbTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5sb2NrTWVudUl0ZW07Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVZlcnNpb25NZW51SXRlbTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZhY2V0c1NlbGVjdGlvblBhbmVsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBtc2csIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9GYWNldHNTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2MyMDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvRmFjZXRzU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXByZXNldHNMYWJlbCA9IENvbmZpZ3VyYXRpb246XCAKLXNhdmVCdXR0b25MYWJlbCA9ICZTYXZlIEFzLi4uCi1kZWxldGVCdXR0b25MYWJlbCA9ICZEZWxldGUKLXNhdmVQcmVzZXREaWFsb2dUaXRsZSA9IFNhdmUgQ29uZmlndXJhdGlvbgotc2F2ZVByZXNldERpYWxvZ01lc3NhZ2UgPSBFbnRlciB0aGUgbmFtZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uCi1mYWNldENvbHVtbkxhYmVsID0gUHJvamVjdCBGYWNldAotdmVyc2lvbkNvbHVtbkxhYmVsID0gVmVyc2lvbgotY291bGROb3REZXNlbGVjdEZpeGVkRmFjZXRNZXNzYWdlID0gUHJvamVjdCBmYWNldCB7MH0gY2Fubm90IGJlIGRlc2VsZWN0ZWQuIEl0IGlzIGNyaXRpY2FsIHRvIHRoZSBwcm9wZXIgZnVuY3Rpb24gb2YgdGhpcyBwcm9qZWN0LgotZGV0YWlsc1RhYkxhYmVsID0gRGV0YWlscwotcnVudGltZXNUYWJMYWJlbCA9IFJ1bnRpbWVzCi1sb2NrTWVudUl0ZW0gPSBMb2NrCi11bmxvY2tNZW51SXRlbSA9IFVubG9jawotY2hhbmdlVmVyc2lvbk1lbnVJdGVtID0gQ2hhbmdlIFZlcnNpb24uLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MTI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1Byb2plY3RGYWNldHNVaU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldFRvcExldmVsRWxlbWVudHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldFVpUGx1Z2luLlBMVUdJTl9JRDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLlByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSUZhY2V0V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VySW1wbCAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX1BBR0VTX0VYVEVOU0lPTl9JRCA9ICJ3aXphcmRQYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX1BBR0VTX0VYVEVOU0lPTl9JRF9PTEQgPSAid2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRVNfRVhURU5TSU9OX0lEID0gImltYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfV0laQVJEX1BBR0VTID0gIndpemFyZC1wYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9JTUFHRSA9ICJpbWFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUlVOVElNRV9DT01QT05FTlRfVFlQRSA9ICJydW50aW1lLWNvbXBvbmVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZyxXaXphcmRQYWdlc0luZm8+IHdpemFyZFBhZ2VzOwotICAgIAotICAgIC8qKgotICAgICAqIE1hcHMgZWl0aGVyIElQcm9qZWN0RmFjZXQgb3IgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHRvIGFuIEltYWdlRGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8T2JqZWN0LEltYWdlRGVzY3JpcHRvcj4gaWNvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsSW1hZ2VEZXNjcmlwdG9yPigpOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBkZWZhdWx0SWNvbjsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JlIGV4dGVuc2lvbnMgYXJlIGxvYWRlZCBmaXJzdC4KLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGVzKCk7Ci0gICAgICAgIAotICAgICAgICB3aXphcmRQYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxXaXphcmRQYWdlc0luZm8+KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCBGYWNldFVpUGx1Z2luLlBMVUdJTl9JRCApOwotICAgICAgICBmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCAiaW1hZ2VzL3Vua25vd24uZ2lmIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlZmF1bHRJY29uID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoIHVybCApOwotICAgICAgICAKLSAgICAgICAgcmVhZFdpemFyZFBhZ2VzRXh0ZW5zaW9ucygpOwotICAgICAgICByZWFkV2l6YXJkUGFnZXNFeHRlbnNpb25zT2xkKCk7Ci0gICAgICAgIHJlYWRJbWFnZXNFeHRlbnNpb25zKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwoKSB7fQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb24oIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltZ2Rlc2MgPSBpY29ucy5nZXQoIG9iaiApOwotICAgICAgICByZXR1cm4gaW1nZGVzYyAhPSBudWxsID8gaW1nZGVzYyA6IGRlZmF1bHRJY29uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8SUZhY2V0V2l6YXJkUGFnZT4gZ2V0V2l6YXJkUGFnZXMoIGZpbmFsIFN0cmluZyBhY3Rpb25JZCApCi0gICAgewotICAgICAgICBmaW5hbCBXaXphcmRQYWdlc0luZm8gaW5mbyA9IHdpemFyZFBhZ2VzLmdldCggYWN0aW9uSWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpbmZvICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V2l6YXJkUGFnZXMoIGluZm8ucGx1Z2luLCBpbmZvLnBhZ2VzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIChlbGVtZW50IHR5cGU6IHtAbGluayBJRmFjZXRXaXphcmRQYWdlfSkKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFdpemFyZFBhZ2VzKCBmaW5hbCBBY3Rpb24uVHlwZSBhY3Rpb25UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgaWYoIGZ2LnN1cHBvcnRzKCBhY3Rpb25UeXBlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgPSAoIChQcm9qZWN0RmFjZXRWZXJzaW9uKSBmdiApLmdldEFjdGlvbkRlZmluaXRpb24oIGFjdGlvblR5cGUgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V2l6YXJkUGFnZXMoIGRlZi5nZXRJZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxJRmFjZXRXaXphcmRQYWdlPiBnZXRXaXphcmRQYWdlcyggZmluYWwgU3RyaW5nIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2xuYW1lcyApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElGYWNldFdpemFyZFBhZ2U+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxJRmFjZXRXaXphcmRQYWdlPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBTdHJpbmcgY2xuYW1lIDogY2xuYW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhZ2VzLmFkZCggKElGYWNldFdpemFyZFBhZ2UpIGNyZWF0ZSggcGx1Z2luLCBjbG5hbWUgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHBhZ2VzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlKCBmaW5hbCBTdHJpbmcgcGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHBsdWdpbiApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsID0gYnVuZGxlLmxvYWRDbGFzcyggY2xuYW1lICk7Ci0gICAgICAgICAgICByZXR1cm4gY2wubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZFRvQ3JlYXRlLCBjbG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IEZhY2V0VWlQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZywgZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRXaXphcmRQYWdlc0V4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnCi0gICAgICAgICAgICAgOiBnZXRUb3BMZXZlbEVsZW1lbnRzKCBmaW5kRXh0ZW5zaW9ucyggUExVR0lOX0lELCBXSVpBUkRfUEFHRVNfRVhURU5TSU9OX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBlbmFtZS5lcXVhbHMoIEVMX1dJWkFSRF9QQUdFUyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9BQ1RJT04gKTsKLQotICAgICAgICAgICAgICAgIGlmKCBhY3Rpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfQUNUSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc0FjdGlvbkRlZmluZWQoIGFjdGlvbiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFdpemFyZFBhZ2VzSW5mbyBwYWdlc0luZm8gPSBuZXcgV2l6YXJkUGFnZXNJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwYWdlc0luZm8ucGx1Z2luID0gcGx1Z2luSWQ7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2VzSW5mby5wYWdlcyA9IHJlYWRQYWdlTGlzdCggY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB3aXphcmRQYWdlcy5wdXQoIGFjdGlvbiwgcGFnZXNJbmZvICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmFjdGlvbk5vdERlZmluZWQsIHBsdWdpbklkLCBhY3Rpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2dFcnJvciggbXNnICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZFdpemFyZFBhZ2VzRXh0ZW5zaW9uc09sZCgpCi0gICAgewotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcKLSAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgV0laQVJEX1BBR0VTX0VYVEVOU0lPTl9JRF9PTEQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGVuYW1lLmVxdWFscyggRUxfV0laQVJEX1BBR0VTICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRXaXphcmRQYWdlc09sZCggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJkZXByZWNhdGlvbiIgKQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZFdpemFyZFBhZ2VzT2xkKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwTXNnIAotICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLndpemFyZEV4dGVuc2lvblBvaW50RGVwcmVjYXRlZCwgcGx1Z2luSWQgKTsKLSAgICAgICAgCi0gICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nV2FybmluZyggZGVwTXNnLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0ZBQ0VUICk7Ci0KLSAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdERlZmluZWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgaWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggaWQgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotCi0gICAgICAgIGlmKCB2ZXJzaW9uID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBmLmhhc1ZlcnNpb24oIHZlcnNpb24gKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcmFtcwotICAgICAgICAgICAgICAgID0gbmV3IFN0cmluZ1tdIHsgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBpZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXRWZXJzaW9uTm90RGVmaW5lZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zICk7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmLmdldFZlcnNpb24oIHZlcnNpb24gKTsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIGFjdGlvblR5cGUgPSBBY3Rpb24uVHlwZS52YWx1ZU9mKCBjaGlsZE5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGFjdGlvblR5cGUgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuaW52YWxpZEFjdGlvblR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGNoaWxkTmFtZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmdi5zdXBwb3J0cyggYWN0aW9uVHlwZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBkZWY7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWYgPSAoIChQcm9qZWN0RmFjZXRWZXJzaW9uKSBmdiApLmdldEFjdGlvbkRlZmluaXRpb24oIGFjdGlvblR5cGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFdpemFyZFBhZ2VzSW5mbyBwYWdlc0luZm8gPSBuZXcgV2l6YXJkUGFnZXNJbmZvKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFnZXNJbmZvLnBsdWdpbiA9IHBsdWdpbklkOwotICAgICAgICAgICAgICAgIHBhZ2VzSW5mby5wYWdlcyA9IHJlYWRQYWdlTGlzdCggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aXphcmRQYWdlcy5wdXQoIGRlZi5nZXRJZCgpLCBwYWdlc0luZm8gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkUGFnZUxpc3QoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1BBR0UgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjbG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBjbG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEltYWdlc0V4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnCi0gICAgICAgICAgICA6IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmRFeHRlbnNpb25zKCBQTFVHSU5fSUQsIElNQUdFU19FWFRFTlNJT05fSUQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGVuYW1lLmVxdWFscyggRUxfSU1BR0UgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2lkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9DQVRFR09SWSApOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByY3QgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1JVTlRJTUVfQ09NUE9ORU5UX1RZUEUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8T2JqZWN0PiB0YXJnZXRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaWQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdERlZmluZWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgZmlkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGZpZCApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNpZCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzQ2F0ZWdvcnlEZWZpbmVkKCBjaWQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuY2F0ZWdvcnlOb3REZWZpbmVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGZpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZCggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcnkoIGNpZCApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJjdCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIFJ1bnRpbWVNYW5hZ2VyLmlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCByY3QgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIHJjdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgdHlwZSA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCByY3QgKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZleHByID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkQWxsKCB0eXBlLmdldFZlcnNpb25zKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkQWxsKCB0eXBlLmdldFZlcnNpb25zKCB2ZXhwciApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfUEFUSCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBwYXRoID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1BBVEggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHBsdWdpbiApOwotICAgICAgICAgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKCBidW5kbGUsIG5ldyBQYXRoKCBwYXRoICksIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdXJsID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmljb25Ob3RGb3VuZCwgcGx1Z2luLCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEltYWdlRGVzY3JpcHRvciBpbWdkZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKCB1cmwgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggT2JqZWN0IHRhcmdldCA6IHRhcmdldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5wdXQoIHRhcmdldCwgaW1nZGVzYyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXJhbXMgCi0gICAgICAgICAgICA9IG5ldyBTdHJpbmdbXSB7IGVsLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBlbC5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLm1pc3NpbmdBdHRyaWJ1dGUsIHBhcmFtcyApOyAKLSAgICAKLSAgICAgICAgRmFjZXRVaVBsdWdpbi5sb2coIG1zZyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXaXphcmRQYWdlc0luZm8KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcGx1Z2luOwotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHBhZ2VzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdBdHRyaWJ1dGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0Tm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFjZXRWZXJzaW9uTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZFRvQ3JlYXRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQWN0aW9uVHlwZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvbk5vdEZvdW5kOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmRFeHRlbnNpb25Qb2ludERlcHJlY2F0ZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5vdERlZmluZWQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBQcm9qZWN0RmFjZXRzVWlNYW5hZ2VySW1wbC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUHJvamVjdEZhY2V0c1VpTWFuYWdlckltcGwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4NjQ1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1Byb2plY3RGYWNldHNVaU1hbmFnZXJJbXBsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1taXNzaW5nQXR0cmlidXRlID0gQW4gZXh0ZW5zaW9uIGVsZW1lbnQgPHsxfT4gaW4gcGx1Z2luIHswfSBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgYXR0cmlidXRlIHsyfS4KLWZhY2V0Tm90RGVmaW5lZCA9IFByb2plY3QgZmFjZXQgezF9IGhhcyBub3QgYmVlbiBkZWZpbmVkLiBJdCBpcyB1c2VkIGluIHBsdWdpbiB7MH0uCi1mYWNldFZlcnNpb25Ob3REZWZpbmVkID0gVmVyc2lvbiB7Mn0gb2YgcHJvamVjdCBmYWNldCB7MX0gaGFzIG5vdCBiZWVuIGRlZmluZWQuIEl0IGlzIHVzZWQgaW4gcGx1Z2luIHswfS4KLWNhdGVnb3J5Tm90RGVmaW5lZCA9IENhdGVnb3J5IHsxfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4gSXQgaXMgdXNlZCBpbiBwbHVnaW4gezB9LgotcnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkID0gUnVudGltZSBjb21wb25lbnQgdHlwZSB7MX0gaGFzIG5vdCBiZWVuIGRlZmluZWQuIEl0IGlzIHVzZWQgaW4gcGx1Z2luIHswfS4KLWZhaWxlZFRvQ3JlYXRlID0gRmFpbGVkIHRvIGluc3RhbnRpYXRlIGNsYXNzIHswfS4KLWludmFsaWRBY3Rpb25UeXBlID0gInsxfSIgaXMgYW4gaW52YWxpZCBhY3Rpb24gdHlwZS4gSXQgaXMgdXNlZCBpbiBwbHVnaW4gezB9LgotaWNvbk5vdEZvdW5kID0gQ291bGQgbm90IGxvYWQgaWNvbiAiezF9IiBmcm9tIHBsdWdpbiB7MH0uCi0KLXdpemFyZEV4dGVuc2lvblBvaW50RGVwcmVjYXRlZCA9IFwKLUV4dGVuc2lvbiBwb2ludCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkIGlzIGRlcHJlY2F0ZWQuIFwKLUl0IGlzIHVzZWQgaW4gcGx1Z2luIHswfS4gXAotRXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyBwcm92aWRlcyBcCi1hbmFsb2dvdXMgZnVuY3Rpb25hbGl0eS4KLQotYWN0aW9uTm90RGVmaW5lZCA9IFByb2plY3QgZmFjZXQgYWN0aW9uICJ7MX0iIGhhcyBub3QgYmVlbiBkZWZpbmVkLiBJdCBpcyB1c2VkIGluIHBsdWdpbiB7MH0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9SdW50aW1lRGVjb3JhdGlvbnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9SdW50aW1lRGVjb3JhdGlvbnNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE5M2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZURlY29yYXRpb25zUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSURlY29yYXRpb25zUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVEZWNvcmF0aW9uc1Byb3ZpZGVyCi0KLSAgICBpbXBsZW1lbnRzIElEZWNvcmF0aW9uc1Byb3ZpZGVyCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFRkFVTFRfUlVOVElNRV9JTUFHRQotICAgICAgICA9IEZhY2V0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCAiaW1hZ2VzL2RlZmF1bHQtcnVudGltZS1pbWFnZS5naWYiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lIHJ1bnRpbWU7Ci0gICAgCi0gICAgcHVibGljIFJ1bnRpbWVEZWNvcmF0aW9uc1Byb3ZpZGVyKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SWNvbigpCi0gICAgewotICAgICAgICBpZiggdGhpcy5ydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkuc2l6ZSgpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjID0gdGhpcy5ydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkuZ2V0KCAwICk7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ID0gcmMuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSURlY29yYXRpb25zUHJvdmlkZXIgcmN2RGVjb3JhdGlvbnNQcm92aWRlciAKLSAgICAgICAgICAgICAgICA9IChJRGVjb3JhdGlvbnNQcm92aWRlcikgcmN2LmdldEFkYXB0ZXIoIElEZWNvcmF0aW9uc1Byb3ZpZGVyLmNsYXNzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByY3ZEZWNvcmF0aW9uc1Byb3ZpZGVyLmdldEljb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBERUZBVUxUX1JVTlRJTUVfSU1BR0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX1RZUEVTID0geyBJRGVjb3JhdGlvbnNQcm92aWRlci5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBJRGVjb3JhdGlvbnNQcm92aWRlci5jbGFzcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lRGVjb3JhdGlvbnNQcm92aWRlciggKElSdW50aW1lKSBhZGFwdGFibGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1J1bnRpbWVzUGFuZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZXNQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM1MDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZXNQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RoYWxpZ247Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGhpbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkd2hpbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbG1hcmdpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLlN3dFV0aWwuZ2V0UHJlZmVycmVkV2lkdGg7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbC5Vbmtub3duUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSURlY29yYXRpb25zUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5CYXNpY1Rvb2xUaXA7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZXNQYW5lbAotCi0gICAgZXh0ZW5kcyBDb21wb3NpdGUKLQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBOT19SVU5USU1FX1NFTEVDVEVEX1BMQUNFSE9MREVSID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dBbGxSdW50aW1lc1NldHRpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDaGVja2JveFRhYmxlVmlld2VyIHJ1bnRpbWVzOwotICAgIHByaXZhdGUgZmluYWwgQnV0dG9uIHNob3dBbGxSdW50aW1lc0NoZWNrYm94OwotICAgIHByaXZhdGUgZmluYWwgQnV0dG9uIG1ha2VQcmltYXJ5QnV0dG9uOwotICAgIHByaXZhdGUgZmluYWwgQnV0dG9uIG5ld1J1bnRpbWVCdXR0b247Ci0gICAgcHJpdmF0ZSBmaW5hbCBMYWJlbCBydW50aW1lQ29tcG9uZW50c0xhYmVsOwotICAgIHByaXZhdGUgZmluYWwgVGFibGVWaWV3ZXIgcnVudGltZUNvbXBvbmVudHM7Ci0gICAgcHJpdmF0ZSBJUnVudGltZSBjdXJyZW50UHJpbWFyeVJ1bnRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPiBsaXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBDb2xvciBjb2xvckdyYXk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSdW50aW1lVmFsaWRhdGlvbkFzc2lzdGFudCBydW50aW1lVmFsaWRhdGlvbkFzc2lzdGFudDsKLSAgICAKLSAgICBwdWJsaWMgUnVudGltZXNQYW5lbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFkZERpc3Bvc2VMaXN0ZW5lcgotICAgICAgICAoIAotICAgICAgICAgICAgbmV3IERpc3Bvc2VMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoIGZpbmFsIERpc3Bvc2VFdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVdpZGdldERpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0dXAgcnVudGltZSB2YWxpZGF0aW9uIGFzc2lzdGFudC4KLSAgICAgICAgCi0gICAgICAgIHRoaXMucnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQgPSBuZXcgUnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQoKTsKLSAgICAgICAKLSAgICAgICAgLy8gQmluZCB0byB0aGUgZGF0YSBtb2RlbC4KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnBqd2MgPSBmcGp3YzsKLSAgICAgICAgCi0gICAgICAgIGFkZERhdGFNb2RlbExpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVBdmFpbGFibGVSdW50aW1lc0NoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5BVkFJTEFCTEVfUlVOVElNRVNfQ0hBTkdFRAotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgYWRkRGF0YU1vZGVsTGlzdGVuZXIKLSAgICAgICAgKCAKLSAgICAgICAgICAgIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhcmdldGFibGVSdW50aW1lc0NoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRBQkxFX1JVTlRJTUVTX0NIQU5HRUQKLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZERhdGFNb2RlbExpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQKLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZERhdGFNb2RlbExpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcmltYXJ5UnVudGltZUNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zaG93QWxsUnVudGltZXNTZXR0aW5nID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29sb3JzLgotICAgICAgICAKLSAgICAgICAgdGhpcy5jb2xvckdyYXkgPSBuZXcgQ29sb3IoIG51bGwsIDE2MCwgMTYwLCAxNjQgKTsKLQotICAgICAgICAvLyBMYXlvdXQgdGhlIHBhbmVsLgotICAgICAgICAKLSAgICAgICAgZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCggMSwgZmFsc2UgKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0KLSAgICAgICAgc2V0TGF5b3V0KCBsYXlvdXQgKTsKLQotICAgICAgICB0aGlzLnJ1bnRpbWVzID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoIHRoaXMsIFNXVC5CT1JERVIgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lcy5nZXRUYWJsZSgpLnNldExheW91dERhdGEoIGdkZmlsbCgpICk7Ci0gICAgICAgIHRoaXMucnVudGltZXMuc2V0Q29udGVudFByb3ZpZGVyKCBuZXcgQ29udGVudFByb3ZpZGVyKCkgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lcy5zZXRMYWJlbFByb3ZpZGVyKCBuZXcgTGFiZWxQcm92aWRlcigpICk7Ci0gICAgICAgIHRoaXMucnVudGltZXMuc2V0U29ydGVyKCBuZXcgU29ydGVyKCkgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lcy5zZXRJbnB1dCggbmV3IE9iamVjdCgpICk7Ci0gICAgICAgIAotICAgICAgICBuZXcgVmFsaWRhdGlvblByb2JsZW1Ub29sVGlwKCB0aGlzLnJ1bnRpbWVzLmdldFRhYmxlKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucnVudGltZXMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVSdW50aW1lU2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucnVudGltZXMuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZCggZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrU3RhdGVDaGFuZ2VkKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zaG93QWxsUnVudGltZXNDaGVja2JveCA9IG5ldyBCdXR0b24oIHRoaXMsIFNXVC5DSEVDSyApOwotICAgICAgICB0aGlzLnNob3dBbGxSdW50aW1lc0NoZWNrYm94LnNldFRleHQoIFJlc291cmNlcy5zaG93QWxsUnVudGltZXMgKTsKLSAgICAgICAgdGhpcy5zaG93QWxsUnVudGltZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oIHRoaXMuc2hvd0FsbFJ1bnRpbWVzU2V0dGluZyApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zaG93QWxsUnVudGltZXNDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2hvd0FsbFJ1bnRpbWVzU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoIHRoaXMsIFNXVC5OT05FICk7Ci0gICAgICAgIGJ1dHRvbnMuc2V0TGF5b3V0RGF0YSggZ2RoYWxpZ24oIGdkKCksIEdyaWREYXRhLkVORCApICk7Ci0gICAgICAgIGJ1dHRvbnMuc2V0TGF5b3V0KCBnbG1hcmdpbnMoIGdsKCAyICksIDAsIDAgKSApOwotICAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZ2Q7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1ha2VQcmltYXJ5QnV0dG9uID0gbmV3IEJ1dHRvbiggYnV0dG9ucywgU1dULlBVU0ggKTsKLSAgICAgICAgdGhpcy5tYWtlUHJpbWFyeUJ1dHRvbi5zZXRUZXh0KCBSZXNvdXJjZXMubWFrZVByaW1hcnlMYWJlbCApOwotICAgICAgICBnZCA9IGdkd2hpbnQoIGdkKCksIGdldFByZWZlcnJlZFdpZHRoKCB0aGlzLm1ha2VQcmltYXJ5QnV0dG9uICkgKyAxNSApOwotICAgICAgICB0aGlzLm1ha2VQcmltYXJ5QnV0dG9uLnNldExheW91dERhdGEoIGdkICk7Ci0gICAgICAgIHRoaXMubWFrZVByaW1hcnlCdXR0b24uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubWFrZVByaW1hcnlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU1ha2VQcmltYXJ5U2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm5ld1J1bnRpbWVCdXR0b24gPSBuZXcgQnV0dG9uKCBidXR0b25zLCBTV1QuUFVTSCApOwotICAgICAgICB0aGlzLm5ld1J1bnRpbWVCdXR0b24uc2V0VGV4dCggUmVzb3VyY2VzLm5ld1J1bnRpbWVCdXR0b25MYWJlbCApOwotICAgICAgICBnZCA9IGdkd2hpbnQoIGdkKCksIGdldFByZWZlcnJlZFdpZHRoKCB0aGlzLm5ld1J1bnRpbWVCdXR0b24gKSArIDE1ICk7Ci0gICAgICAgIHRoaXMubmV3UnVudGltZUJ1dHRvbi5zZXRMYXlvdXREYXRhKCBnZCApOwotCi0gICAgICAgIHRoaXMubmV3UnVudGltZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV3UnVudGltZUJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50c0xhYmVsID0gbmV3IExhYmVsKCB0aGlzLCBTV1QuTk9ORSApOwotICAgICAgICB0aGlzLnJ1bnRpbWVDb21wb25lbnRzTGFiZWwuc2V0VGV4dCggUmVzb3VyY2VzLnJ1bnRpbWVDb21wb3NpdGlvbkxhYmVsICk7Ci0gICAgICAgIHRoaXMucnVudGltZUNvbXBvbmVudHNMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbG9yIGluZm9CYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvciggU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQ29sb3IgaW5mb0ZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJ1bnRpbWVDb21wb25lbnRzID0gbmV3IFRhYmxlVmlld2VyKCB0aGlzLCBTV1QuQk9SREVSICk7Ci0gICAgICAgIHRoaXMucnVudGltZUNvbXBvbmVudHMuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKCBnZGhoaW50KCBnZGhmaWxsKCksIDUwICkgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5nZXRUYWJsZSgpLnNldEJhY2tncm91bmQoIGluZm9CYWNrZ3JvdW5kQ29sb3IgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5nZXRUYWJsZSgpLnNldEZvcmVncm91bmQoIGluZm9Gb3JlZ3JvdW5kQ29sb3IgKTsKLSAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5zZXRDb250ZW50UHJvdmlkZXIoIG5ldyBSdW50aW1lQ29tcG9uZW50c0NvbnRlbnRQcm92aWRlcigpICk7Ci0gICAgICAgIHRoaXMucnVudGltZUNvbXBvbmVudHMuc2V0TGFiZWxQcm92aWRlciggbmV3IFJ1bnRpbWVDb21wb25lbnRzTGFiZWxQcm92aWRlcigpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLnNldElucHV0KCBOT19SVU5USU1FX1NFTEVDVEVEX1BMQUNFSE9MREVSICk7Ci0gICAgICAgIHRoaXMucnVudGltZUNvbXBvbmVudHMuZ2V0VGFibGUoKS5zZXRFbmFibGVkKCBmYWxzZSApOwotICAgICAgICB0aGlzLnJ1bnRpbWVDb21wb25lbnRzTGFiZWwuc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgdGhpcy5jdXJyZW50UHJpbWFyeVJ1bnRpbWUgPSB0aGlzLmZwandjLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgIAotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KCBwYXJlbnQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZnBqd2M7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBdmFpbGFibGVSdW50aW1lc0NoYW5nZWQoKQotICAgIHsKLSAgICAgICAgaWYoICEgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5lcXVhbHMoIGdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0RGlzcGxheSgpLmFzeW5jRXhlYwotICAgICAgICAgICAgKCAKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQXZhaWxhYmxlUnVudGltZXNDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnNob3dBbGxSdW50aW1lc1NldHRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRhcmdldGFibGVSdW50aW1lc0NoYW5nZWQoKQotICAgIHsKLSAgICAgICAgaWYoICEgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5lcXVhbHMoIGdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0RGlzcGxheSgpLmFzeW5jRXhlYwotICAgICAgICAgICAgKCAKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFyZ2V0YWJsZVJ1bnRpbWVzQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZCgpCi0gICAgewotICAgICAgICBpZiggISBUaHJlYWQuY3VycmVudFRocmVhZCgpLmVxdWFscyggZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXREaXNwbGF5KCkuYXN5bmNFeGVjCi0gICAgICAgICAgICAoIAotICAgICAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHRhcmdldGVkID0gdGhpcy5mcGp3Yy5nZXRUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElSdW50aW1lIHIgOiB0aGlzLmZwandjLmdldFRhcmdldGFibGVSdW50aW1lcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRhcmdldGVkLmNvbnRhaW5zKCByICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMucnVudGltZXMuZ2V0Q2hlY2tlZCggciApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucnVudGltZXMuc2V0Q2hlY2tlZCggciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5ydW50aW1lcy5nZXRDaGVja2VkKCByICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lcy5zZXRDaGVja2VkKCByLCBmYWxzZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkKCkKLSAgICB7Ci0gICAgICAgIGlmKCAhIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZXF1YWxzKCBnZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldERpc3BsYXkoKS5hc3luY0V4ZWMKLSAgICAgICAgICAgICggCi0gICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVByaW1hcnlSdW50aW1lQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5jdXJyZW50UHJpbWFyeVJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucnVudGltZXMudXBkYXRlKCB0aGlzLmN1cnJlbnRQcmltYXJ5UnVudGltZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmN1cnJlbnRQcmltYXJ5UnVudGltZSA9IHRoaXMuZnBqd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmN1cnJlbnRQcmltYXJ5UnVudGltZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ydW50aW1lcy51cGRhdGUoIHRoaXMuY3VycmVudFByaW1hcnlSdW50aW1lLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrU3RhdGVDaGFuZ2VkKCBmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggISBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuZ2V0VGFyZ2V0YWJsZVJ1bnRpbWVzKCkuY29udGFpbnMoIHJ1bnRpbWUgKSAmJgotICAgICAgICAgICAgISAoIHJ1bnRpbWUgaW5zdGFuY2VvZiBVbmtub3duUnVudGltZSApICYmIGUuZ2V0Q2hlY2tlZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ydW50aW1lcy5zZXRDaGVja2VkKCBydW50aW1lLCBmYWxzZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggZS5nZXRDaGVja2VkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwandjLmFkZFRhcmdldGVkUnVudGltZSggcnVudGltZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGp3Yy5yZW1vdmVUYXJnZXRlZFJ1bnRpbWUoIHJ1bnRpbWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUnVudGltZVNlbGVjdGlvbkNoYW5nZWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgciA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgaWYoIHIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLmdldElucHV0KCkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50c0xhYmVsLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5nZXRUYWJsZSgpLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5zZXRJbnB1dCggTk9fUlVOVElNRV9TRUxFQ1RFRF9QTEFDRUhPTERFUiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucnVudGltZUNvbXBvbmVudHMuZ2V0SW5wdXQoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgISB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLmdldElucHV0KCkuZXF1YWxzKCByICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucnVudGltZUNvbXBvbmVudHNMYWJlbC5zZXRFbmFibGVkKCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5nZXRUYWJsZSgpLnNldEVuYWJsZWQoIHRydWUgKTsKLSAgICAgICAgICAgICAgICB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLnNldElucHV0KCByICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnJ1bnRpbWVzLmdldENoZWNrZWQoIHIgKSAmJiAKLSAgICAgICAgICAgICAgICB0aGlzLmZwandjLmdldFByaW1hcnlSdW50aW1lKCkgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAhIHRoaXMuZnBqd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKS5lcXVhbHMoIHIgKSAmJgotICAgICAgICAgICAgICAgICggdGhpcy5mcGp3Yy5nZXRUYXJnZXRhYmxlUnVudGltZXMoKS5jb250YWlucyggciApIHx8IHIgaW5zdGFuY2VvZiBVbmtub3duUnVudGltZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ha2VQcmltYXJ5QnV0dG9uLnNldEVuYWJsZWQoIHRydWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ha2VQcmltYXJ5QnV0dG9uLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNob3dBbGxSdW50aW1lc1NlbGVjdGVkKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2hvd0FsbFJ1bnRpbWVzU2V0dGluZyAKLSAgICAgICAgICAgID0gdGhpcy5zaG93QWxsUnVudGltZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1ha2VQcmltYXJ5U2VsZWN0ZWQoKQotICAgIHsKLSAgICAgICAgdGhpcy5mcGp3Yy5zZXRQcmltYXJ5UnVudGltZSggZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTmV3UnVudGltZUJ1dHRvblNlbGVjdGVkKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBTRVJWRVJfVUlfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJzaG93TmV3UnVudGltZVdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBzZXJ2ZXJVaUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggU0VSVkVSX1VJX1BMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHNlcnZlclVpQnVuZGxlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5ld1J1bnRpbWVCdXR0b24uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBzZXJ2ZXJVaVBsdWdpbkNsYXNzID0gc2VydmVyVWlCdW5kbGUubG9hZENsYXNzKCBDTEFTU19OQU1FICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QKLSAgICAgICAgICAgICAgICA9IHNlcnZlclVpUGx1Z2luQ2xhc3MuZ2V0TWV0aG9kKCBNRVRIT0RfTkFNRSwgU2hlbGwuY2xhc3MsIFN0cmluZy5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZSggbnVsbCwgZ2V0U2hlbGwoKSwgbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcmVzdWx0LmVxdWFscyggdHJ1ZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBUaHJlYWQgcmVmcmVzaFRocmVhZCA9IG5ldyBUaHJlYWQoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLnJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVmcmVzaFRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0VWlQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RGlzcG9zZWQoKQotICAgIHsKLSAgICAgICAgcmVtb3ZlRGF0YU1vZGVsTGlzdGVuZXJzKCk7Ci0gICAgICAgIHRoaXMuY29sb3JHcmF5LmRpc3Bvc2UoKTsKLSAgICAgICAgdGhpcy5ydW50aW1lVmFsaWRhdGlvbkFzc2lzdGFudC5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lVmFsaWRhdGlvblJlc3VsdENoYW5nZWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgUnVubmFibGUgdWlSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBUYWJsZUl0ZW0gaXRlbSA6IFJ1bnRpbWVzUGFuZWwudGhpcy5ydW50aW1lcy5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZXNQYW5lbC50aGlzLnJ1bnRpbWVzLnVwZGF0ZSggaXRlbS5nZXREYXRhKCksIG51bGwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBnZXREaXNwbGF5KCkuc3luY0V4ZWMoIHVpUnVubmFibGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goKQotICAgIHsKLSAgICAgICAgdGhpcy5ydW50aW1lcy5yZWZyZXNoKCk7Ci0KLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiB1bnRhcmdldGFibGUgPSBuZXcgSGFzaFNldDxJUnVudGltZT4oIFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgdW50YXJnZXRhYmxlLnJlbW92ZUFsbCggdGhpcy5mcGp3Yy5nZXRUYXJnZXRhYmxlUnVudGltZXMoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5ydW50aW1lcy5zZXRDaGVja2VkRWxlbWVudHMoIHRoaXMuZnBqd2MuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnRvQXJyYXkoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElSdW50aW1lIGdldFNlbGVjdGlvbigpCi0gICAgewotICAgICAgICBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsIAotICAgICAgICAgICAgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucnVudGltZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3NlbC5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSVJ1bnRpbWUpIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZERhdGFNb2RlbExpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZCggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZURhdGFNb2RlbExpc3RlbmVycygpCi0gICAgewotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwandjLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVGFibGVJdGVtIGdldFRhYmxlSXRlbSggZmluYWwgaW50IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSApCi0gICAgewotICAgICAgICBmb3IoIFRhYmxlSXRlbSBpdGVtIDogdGhpcy5ydW50aW1lcy5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaXRlbS5nZXRCb3VuZHMoKS5jb250YWlucyggeCwgeSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQgZ2V0UnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udGVudFByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBSdW50aW1lc1BhbmVsLnRoaXMuc2hvd0FsbFJ1bnRpbWVzU2V0dGluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcnVudGltZXMuYWRkQWxsKCBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcnVudGltZXMuYWRkQWxsKCBmcGp3Yy5nZXRUYXJnZXRhYmxlUnVudGltZXMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gZnBqd2MuZ2V0RmFjZXRlZFByb2plY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZwaiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBmcGouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBydW50aW1lIGluc3RhbmNlb2YgVW5rbm93blJ1bnRpbWUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lcy5hZGQoIHJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWVzLnRvQXJyYXkoKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCggZmluYWwgVmlld2VyIHZpZXdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2xkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXdPYmplY3QgKSB7fQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIExhYmVsUHJvdmlkZXIKLQotICAgICAgICBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJQ29sb3JQcm92aWRlcgotICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTGFiZWxQcm92aWRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCggZmluYWwgT2JqZWN0IGVsZW1lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCAoSVJ1bnRpbWUpIGVsZW1lbnQgKS5nZXRMb2NhbGl6ZWROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHZhbGlkYXRpb25SZXN1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHJ1bnRpbWUuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBpc1ByaW1hcnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIsIyNwcmltYXJ5IyMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHZhbGlkYXRpb25SZXN1bHQgIT0gbnVsbCAmJiB2YWxpZGF0aW9uUmVzdWx0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggIiwjI2Vycm9yIyMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHIgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBwcmltYXJ5ID0gZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IHByaW1hcnkgIT0gbnVsbCAmJiBwcmltYXJ5LmVxdWFscyggciApOwotICAgICAgICAgICAgZmluYWwgSVN0YXR1cyB2YWxSZXN1bHQgPSBnZXRSdW50aW1lVmFsaWRhdGlvbkFzc2lzdGFudCgpLmdldFZhbGlkYXRpb25SZXN1bHQoIHIgKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbWdpZCA9IGdldEltYWdlUmVnaXN0cnlLZXkoIHIsIGlzUHJpbWFyeSwgdmFsUmVzdWx0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gdGhpcy5pbWFnZVJlZ2lzdHJ5LmdldCggaW1naWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGltYWdlID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElEZWNvcmF0aW9uc1Byb3ZpZGVyIGRlY3Byb3YKLSAgICAgICAgICAgICAgICAgICAgPSAoSURlY29yYXRpb25zUHJvdmlkZXIpIHIuZ2V0QWRhcHRlciggSURlY29yYXRpb25zUHJvdmlkZXIuY2xhc3MgKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIEltYWdlRGVzY3JpcHRvciBpbWdkZXNjCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IERlY29yYXRlZFJ1bnRpbWVJbWFnZURlc2NyaXB0b3IoIGRlY3Byb3YuZ2V0SWNvbigpLCBpc1ByaW1hcnksIHZhbFJlc3VsdCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VSZWdpc3RyeS5wdXQoIGltZ2lkLCBpbWdkZXNjICk7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgPSB0aGlzLmltYWdlUmVnaXN0cnkuZ2V0KCBpbWdpZCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggUnVudGltZXNQYW5lbC50aGlzLmZwandjLmdldFRhcmdldGVkUnVudGltZXMoKS5jb250YWlucyggciApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSdW50aW1lc1BhbmVsLnRoaXMucnVudGltZXMuc2V0Q2hlY2tlZCggciwgdHJ1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJ1bnRpbWVzUGFuZWwudGhpcy5ydW50aW1lcy5zZXRDaGVja2VkKCByLCBmYWxzZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuZ2V0VGFyZ2V0YWJsZVJ1bnRpbWVzKCkuY29udGFpbnMoIHIgKSAmJgotICAgICAgICAgICAgICAgICEgKCByIGluc3RhbmNlb2YgVW5rbm93blJ1bnRpbWUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdyZXllZElkID0gci5nZXROYW1lKCkgKyAiIyNncmV5ZWQjIyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJbWFnZSBncmV5ZWQgPSB0aGlzLmltYWdlUmVnaXN0cnkuZ2V0KCBncmV5ZWRJZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBncmV5ZWQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBncmV5ZWQgPSBuZXcgSW1hZ2UoIG51bGwsIGltYWdlLCBTV1QuSU1BR0VfR1JBWSApOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlUmVnaXN0cnkucHV0KCBncmV5ZWRJZCwgZ3JleWVkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGltYWdlID0gZ3JleWVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5nZXRUYXJnZXRhYmxlUnVudGltZXMoKS5jb250YWlucyggZWxlbWVudCApICYmCi0gICAgICAgICAgICAgICAgISAoIGVsZW1lbnQgaW5zdGFuY2VvZiBVbmtub3duUnVudGltZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUnVudGltZXNQYW5lbC50aGlzLmNvbG9yR3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW1hZ2VSZWdpc3RyeS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoIGZpbmFsIE9iamVjdCBlbGVtZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lciApIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyICkge30KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFNvcnRlcgotCi0gICAgICAgIGV4dGVuZHMgVmlld2VyU29ydGVyCi0gICAgCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIGZpbmFsIFZpZXdlciB2aWV3ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSByMSA9IChJUnVudGltZSkgYTsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHIyID0gKElSdW50aW1lKSBiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcjEuZ2V0TG9jYWxpemVkTmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoIHIyLmdldExvY2FsaXplZE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUnVudGltZUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIKLQotICAgICAgICBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gICAgCi0gICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoIGZpbmFsIE9iamVjdCBlbGVtZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGVsZW1lbnQgPT0gTk9fUlVOVElNRV9TRUxFQ1RFRF9QTEFDRUhPTERFUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IE5PX1JVTlRJTUVfU0VMRUNURURfUExBQ0VIT0xERVIgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSByID0gKElSdW50aW1lKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiByLmdldFJ1bnRpbWVDb21wb25lbnRzKCkudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IH0KLSAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKCBmaW5hbCBWaWV3ZXIgdmlld2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvbGRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5ld09iamVjdCApIHt9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUnVudGltZUNvbXBvbmVudHNMYWJlbFByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50ID09IE5PX1JVTlRJTUVfU0VMRUNURURfUExBQ0VIT0xERVIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMubm9SdW50aW1lU2VsZWN0ZWRMYWJlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgY29tcCA9IChJUnVudGltZUNvbXBvbmVudCkgZWxlbWVudDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgPSAoSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyKSBjb21wLmdldEFkYXB0ZXIoIElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJvdmlkZXIgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGxhYmVsLmFwcGVuZCggY29tcC5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpLmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5hcHBlbmQoICcgJyApOwotICAgICAgICAgICAgICAgIGxhYmVsLmFwcGVuZCggY29tcC5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRMYWJlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKCBmaW5hbCBPYmplY3QgZWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50ID09IE5PX1JVTlRJTUVfU0VMRUNURURfUExBQ0VIT0xERVIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyA9IChJUnVudGltZUNvbXBvbmVudCkgZWxlbWVudDsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QgPSByYy5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA9IHJjLmdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSByY3QuZ2V0SWQoKSArICI6IiArIHJjdi5nZXRWZXJzaW9uU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gdGhpcy5pbWFnZVJlZ2lzdHJ5LmdldCgga2V5ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBpbWFnZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRGVjb3JhdGlvbnNQcm92aWRlciBkZWNwcm92Ci0gICAgICAgICAgICAgICAgICAgID0gKElEZWNvcmF0aW9uc1Byb3ZpZGVyKSByY3YuZ2V0QWRhcHRlciggSURlY29yYXRpb25zUHJvdmlkZXIuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmltYWdlUmVnaXN0cnkucHV0KCBrZXksIGRlY3Byb3YuZ2V0SWNvbigpICk7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgPSB0aGlzLmltYWdlUmVnaXN0cnkuZ2V0KCBrZXkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGltYWdlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbWFnZVJlZ2lzdHJ5LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eSggZmluYWwgT2JqZWN0IGVsZW1lbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyICkge30KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgKSB7fQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWNvcmF0ZWRSdW50aW1lSW1hZ2VEZXNjcmlwdG9yIAotICAgIAotICAgICAgICBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciAKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9SVU5USU1FX09WRVJMQVlfSU1HX0xPQ0FUSU9OCi0gICAgICAgICAgICA9ICJpbWFnZXMvcHJpbWFyeS1ydW50aW1lLW92ZXJsYXkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEYXRhIFBSSU1BUllfUlVOVElNRV9PVkVSTEFZCi0gICAgICAgICAgICA9IEZhY2V0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCBQUklNQVJZX1JVTlRJTUVfT1ZFUkxBWV9JTUdfTE9DQVRJT04gKS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PVkVSTEFZX0lNR19MT0NBVElPTgotICAgICAgICAgICAgPSAiaW1hZ2VzL2Vycm9yLW92ZXJsYXkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEYXRhIEVSUk9SX09WRVJMQVkKLSAgICAgICAgICAgID0gRmFjZXRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIEVSUk9SX09WRVJMQVlfSU1HX0xPQ0FUSU9OICkuZ2V0SW1hZ2VEYXRhKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfT1ZFUkxBWV9JTUdfTE9DQVRJT04KLSAgICAgICAgICAgID0gImltYWdlcy93YXJuaW5nLW92ZXJsYXkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEYXRhIFdBUk5JTkdfT1ZFUkxBWQotICAgICAgICAgICAgPSBGYWNldFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvciggV0FSTklOR19PVkVSTEFZX0lNR19MT0NBVElPTiApLmdldEltYWdlRGF0YSgpOwotICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIEltYWdlRGF0YSBiYXNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFBvaW50IHNpemU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHByaXZhdGUgSVN0YXR1cyB2YWxSZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRGVjb3JhdGVkUnVudGltZUltYWdlRGVzY3JpcHRvciggZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgdmFsUmVzdWx0ICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IGJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICB0aGlzLnNpemUgPSBuZXcgUG9pbnQoIHRoaXMuYmFzZS53aWR0aCwgdGhpcy5iYXNlLmhlaWdodCApOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICB0aGlzLnZhbFJlc3VsdCA9IHZhbFJlc3VsdDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoIGZpbmFsIGludCB3aWR0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCApIAotICAgICAgICB7Ci0gICAgICAgICAgICBkcmF3SW1hZ2UoIHRoaXMuYmFzZSwgMCwgMCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5pc1ByaW1hcnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRyYXdJbWFnZSggUFJJTUFSWV9SVU5USU1FX09WRVJMQVksIHdpZHRoIC0gUFJJTUFSWV9SVU5USU1FX09WRVJMQVkud2lkdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0gUFJJTUFSWV9SVU5USU1FX09WRVJMQVkuaGVpZ2h0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnZhbFJlc3VsdCAhPSBudWxsICYmICEgdGhpcy52YWxSZXN1bHQuaXNPSygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbWFnZURhdGEgdmFsT3ZlcmxheQotICAgICAgICAgICAgICAgICAgICA9IHRoaXMudmFsUmVzdWx0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiAKLSAgICAgICAgICAgICAgICAgICAgICA/IEVSUk9SX09WRVJMQVkgOiBXQVJOSU5HX09WRVJMQVk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZHJhd0ltYWdlKCB2YWxPdmVybGF5LCAwLCBoZWlnaHQgLSB2YWxPdmVybGF5LmhlaWdodCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25Qcm9ibGVtVG9vbFRpcAotICAgIAotICAgICAgICBleHRlbmRzIEJhc2ljVG9vbFRpcAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uUHJvYmxlbVRvb2xUaXAoIGZpbmFsIENvbnRyb2wgY29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBjb250cm9sICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvb2xUaXBDb250ZW50QXJlYSggZmluYWwgRXZlbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVN0YXR1cyB2YWxpZGF0aW9uUmVzdWx0ID0gZ2V0VmFsaWRhdGlvblJlc3VsdCggZXZlbnQgKTsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoIHZhbGlkYXRpb25SZXN1bHQuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlVG9vbFRpcENvbnRlbnRBcmVhKCBldmVudCwgcGFyZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRDcmVhdGVUb29sVGlwKCBmaW5hbCBFdmVudCBldmVudCApIAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gISBnZXRWYWxpZGF0aW9uUmVzdWx0KCBldmVudCApLmlzT0soKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBJUnVudGltZSBnZXRSdW50aW1lKCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGVJdGVtKCBldmVudC54LCBldmVudC55ICk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbSAhPSBudWxsID8gKElSdW50aW1lKSBpdGVtLmdldERhdGEoKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgSVN0YXR1cyBnZXRWYWxpZGF0aW9uUmVzdWx0KCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBnZXRSdW50aW1lKCBldmVudCApOwotICAgICAgICAgICAgSVN0YXR1cyByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSdW50aW1lc1BhbmVsLnRoaXMucnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQuZ2V0VmFsaWRhdGlvblJlc3VsdCggcnVudGltZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcmVzdWx0ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSdW50aW1lVmFsaWRhdGlvbkFzc2lzdGFudAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLElTdGF0dXM+IHZhbGlkYXRpb25SZXN1bHRzOwotICAgICAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgcnVudGltZUxpZmVjeWNsZUxpc3RlbmVyOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJ1bnRpbWVWYWxpZGF0aW9uQXNzaXN0YW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJU3RhdHVzPigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciA9IG5ldyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudCBldnQgPSAoSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQpIGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0aW9uUmVzdWx0KCBldnQuZ2V0UnVudGltZSgpLCBldnQuZ2V0TmV3VmFsaWRhdGlvblN0YXR1cygpICk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJ1bnRpbWVWYWxpZGF0aW9uUmVzdWx0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFRocmVhZCBpbml0aWFsVmFsaWRhdGlvblRocmVhZCA9IG5ldyBUaHJlYWQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyByZXN1bHQgPSBydW50aW1lLnZhbGlkYXRlKCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCggUnVudGltZVZhbGlkYXRpb25Bc3Npc3RhbnQudGhpcy52YWxpZGF0aW9uUmVzdWx0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGdldFZhbGlkYXRpb25SZXN1bHQoIHJ1bnRpbWUgKSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRpb25SZXN1bHQoIHJ1bnRpbWUsIHJlc3VsdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZU1hbmFnZXIuYWRkTGlzdGVuZXIoIFJ1bnRpbWVWYWxpZGF0aW9uQXNzaXN0YW50LnRoaXMucnVudGltZUxpZmVjeWNsZUxpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS5WQUxJREFUSU9OX1NUQVRVU19DSEFOR0VEICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVSdW50aW1lVmFsaWRhdGlvblJlc3VsdENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbml0aWFsVmFsaWRhdGlvblRocmVhZC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSVN0YXR1cyBnZXRWYWxpZGF0aW9uUmVzdWx0KCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLnZhbGlkYXRpb25SZXN1bHRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uUmVzdWx0cy5nZXQoIHJ1bnRpbWUuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRWYWxpZGF0aW9uUmVzdWx0KCBmaW5hbCBJUnVudGltZSBydW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyB2YWxpZGF0aW9uUmVzdWx0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLnZhbGlkYXRpb25SZXN1bHRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHRzLnB1dCggcnVudGltZS5nZXROYW1lKCksIHZhbGlkYXRpb25SZXN1bHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJ1bnRpbWVNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKCB0aGlzLnJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZUNvbXBvc2l0aW9uTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VQcmltYXJ5TGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1J1bnRpbWVCdXR0b25MYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0FsbFJ1bnRpbWVzOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub1J1bnRpbWVTZWxlY3RlZExhYmVsOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUnVudGltZXNQYW5lbC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZXNQYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9SdW50aW1lc1BhbmVsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZjBkZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9SdW50aW1lc1BhbmVsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXJ1bnRpbWVDb21wb3NpdGlvbkxhYmVsID0gUnVudGltZSBjb21wb3NpdGlvbjoKLW1ha2VQcmltYXJ5TGFiZWwgPSBNYWtlIFByaW1hcnkKLW5ld1J1bnRpbWVCdXR0b25MYWJlbCA9IE5ldy4uLgotc2hvd0FsbFJ1bnRpbWVzID0gU2hvdyBhbGwgcnVudGltZXMKLW5vUnVudGltZVNlbGVjdGVkTGFiZWwgPSA8bm8gcnVudGltZSBzZWxlY3RlZD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1J1bnRpbWVzUHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1J1bnRpbWVzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGE5Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9SdW50aW1lc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFJ1bnRpbWVzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIAotewotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBwcm9qZWN0TGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YzsKLSAgICBwcml2YXRlIFJ1bnRpbWVzUGFuZWwgcGFuZWw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiggZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZnBqd2MgPSBTaGFyZWRXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoIHRoaXMucHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnByb2plY3RMaXN0ZW5lciA9IG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVByb2plY3RDaGFuZ2VkRXZlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnByb2plY3QuYWRkTGlzdGVuZXIoIHRoaXMucHJvamVjdExpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCggMSwgZmFsc2UgKTsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5Cb3R0b20gPSA1OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5wYW5lbCA9IG5ldyBSdW50aW1lc1BhbmVsKCBjb21wb3NpdGUsIHRoaXMuZnBqd2MgKTsKLSAgICAgICAgICAgIHRoaXMucGFuZWwuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLQotICAgICAgICAgICAgZmluYWwgTGFiZWwgaGludCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuV1JBUCApOwotICAgICAgICAgICAgaGludC5zZXRUZXh0KCBSZXNvdXJjZXMuaGludCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBHcmlkRGF0YSBnZCA9IGdkaGZpbGwoKTsKLSAgICAgICAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgZ2Qud2lkdGhIaW50ID0gMzAwOwotICAgICAgICAgICAgZ2QudmVydGljYWxJbmRlbnQgPSA1OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBoaW50LnNldExheW91dERhdGEoIGdkICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEh5cGVybGluayB1bmluc3RhbGxGYWNldHNMaW5rID0gbmV3IEh5cGVybGluayggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICAgICAgdW5pbnN0YWxsRmFjZXRzTGluay5zZXRGb3JlZ3JvdW5kKCBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfREFSS19CTFVFICkgKTsKLSAgICAgICAgICAgIHVuaW5zdGFsbEZhY2V0c0xpbmsuc2V0VW5kZXJsaW5lZCggdHJ1ZSApOwotICAgICAgICAgICAgdW5pbnN0YWxsRmFjZXRzTGluay5zZXRUZXh0KCBSZXNvdXJjZXMudW5pbnN0YWxsRmFjZXRzTGlua0xhYmVsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVuaW5zdGFsbEZhY2V0c0xpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZCggZmluYWwgSHlwZXJsaW5rRXZlbnQgZXZ0ICkgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1BZGRSZW1vdmVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICBuZXcgRGlzcG9zZUxpc3RlbmVyKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKCBmaW5hbCBEaXNwb3NlRXZlbnQgZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc3Bvc2VFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIAotICAgIAkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udCggcGFyZW50ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIAotICAgIHsKLSAgICAgICAgZmluYWwgUnVubmFibGUgb3AgPSBuZXcgUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZXNQcm9wZXJ0eVBhZ2UudGhpcy5mcGp3Yy5jb21taXRDaGFuZ2VzKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IGUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoIGdldFNoZWxsKCksIFJlc291cmNlcy5lcnJEbGdUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5nZXRNZXNzYWdlKCksIHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldFVpUGx1Z2luLmxvZyggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSggbnVsbCwgb3AgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGp3Yy5zZXRUYXJnZXRlZFJ1bnRpbWVzKCB0aGlzLnByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgIHRoaXMuZnBqd2Muc2V0UHJpbWFyeVJ1bnRpbWUoIHRoaXMucHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtQWRkUmVtb3ZlRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElXaXphcmQgd2l6YXJkID0gbmV3IE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkKCB0aGlzLnByb2plY3QgKTsKLSAgICAgICAgZmluYWwgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coIGdldFNoZWxsKCksIHdpemFyZCApOwotICAgICAgICAKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUHJvamVjdENoYW5nZWRFdmVudCgpCi0gICAgewotICAgICAgICB0aGlzLmZwandjLnJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gdGFyZ2V0ZWRSdW50aW1lcyA9IHRoaXMucHJvamVjdC5nZXRUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0gICAgICAgIHRoaXMuZnBqd2Muc2V0VGFyZ2V0ZWRSdW50aW1lcyggdGFyZ2V0ZWRSdW50aW1lcyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgcHJpbWFyeVJ1bnRpbWUgPSB0aGlzLnByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgdGhpcy5mcGp3Yy5zZXRQcmltYXJ5UnVudGltZSggcHJpbWFyeVJ1bnRpbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURpc3Bvc2VFdmVudCgpCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QucmVtb3ZlTGlzdGVuZXIoIHRoaXMucHJvamVjdExpc3RlbmVyICk7Ci0gICAgICAgIFNoYXJlZFdvcmtpbmdDb3B5TWFuYWdlci5yZWxlYXNlV29ya2luZ0NvcHkoIHRoaXMucHJvamVjdCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBHcmlkRGF0YSBnZGZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTkxTCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJEbGdUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaGludDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pbnN0YWxsRmFjZXRzTGlua0xhYmVsOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUnVudGltZXNQcm9wZXJ0eVBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZXNQcm9wZXJ0eVBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvUnVudGltZXNQcm9wZXJ0eVBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2YTU4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1J1bnRpbWVzUHJvcGVydHlQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWVyckRsZ1RpdGxlID0gRXJyb3IKLQotaGludCA9IFwKLUlmIGEgcnVudGltZSB0aGF0IHlvdSB3YW50IHRvIHNlbGVjdCBpcyBub3QgZGlzcGxheWVkIG9yIGlzIGRpc2FibGVkIHlvdSBtYXkgXAotbmVlZCB0byB1bmluc3RhbGwgb25lIG9yIG1vcmUgb2YgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgcHJvamVjdCBmYWNldHMuCi0KLXVuaW5zdGFsbEZhY2V0c0xpbmtMYWJlbCA9IFVuaW5zdGFsbCBGYWNldHMuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvU2F2ZVByZXNldERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TYXZlUHJlc2V0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NGVkOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TYXZlUHJlc2V0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTYXZlUHJlc2V0RGlhbG9nCi0KLSAgICBleHRlbmRzIERpYWxvZwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotICAgIHByaXZhdGUgVGV4dCBuYW1lVGV4dEZpZWxkOwotICAgIHByaXZhdGUgVGV4dCBkZXNjVGV4dEZpZWxkOwotICAgIHByaXZhdGUgTGFiZWwgbXNnTGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2F2ZVByZXNldERpYWxvZyggZmluYWwgU2hlbGwgc2hlbGwgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHNoZWxsICk7Ci0gICAgICAgIAotICAgICAgICBzZXRTaGVsbFN0eWxlKCBnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByZXNldCBzaG93RGlhbG9nKCBmaW5hbCBTaGVsbCBzaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2F2ZVByZXNldERpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZVByZXNldERpYWxvZyggc2hlbGwgKTsKLSAgICAgICAgCi0gICAgICAgIElQcmVzZXQgcHJlc2V0ID0gbnVsbDsKLQotICAgICAgICBpZiggZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBkaWFsb2cubmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjID0gZGlhbG9nLmRlc2NyaXB0aW9uOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmVzZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5kZWZpbmVQcmVzZXQoIG5hbWUsIGRlc2MsIGZhY2V0cyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJlc2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKCBmaW5hbCBTaGVsbCBzaGVsbCApCi0gICAgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbCggc2hlbGwgKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dCggUmVzb3VyY2VzLmRpYWxvZ1RpdGxlICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYSggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgSURpYWxvZ1NldHRpbmdzIHJvb3QKLSAgICAgICAgICAgID0gRmFjZXRVaVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgCi0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB0ZW1wID0gcm9vdC5nZXRTZWN0aW9uKCBnZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgIAotICAgICAgICBpZiggdGVtcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IHJvb3QuYWRkTmV3U2VjdGlvbiggZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHRlbXAuZ2V0KCBXSURUSCApID09IG51bGwgKSB0ZW1wLnB1dCggV0lEVEgsIDMwMCApOwotICAgICAgICBpZiggdGVtcC5nZXQoIEhFSUdIVCApID09IG51bGwgKSB0ZW1wLnB1dCggSEVJR0hULCAxNjAgKTsKLQotICAgICAgICB0aGlzLnNldHRpbmdzID0gdGVtcDsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCAxLCBmYWxzZSApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBHcmlkRGF0YSBnZCA9IGdkZmlsbCgpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSB0aGlzLnNldHRpbmdzLmdldEludCggV0lEVEggKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IHRoaXMuc2V0dGluZ3MuZ2V0SW50KCBIRUlHSFQgKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZCApOwotICAgICAgICAKLSAgICAgICAgY29tcG9zaXRlLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIFNXVC5SZXNpemUsCi0gICAgICAgICAgICBuZXcgTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gY29tcG9zaXRlLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFNhdmVQcmVzZXREaWFsb2cudGhpcy5zZXR0aW5ncy5wdXQoIFdJRFRILCBzaXplLnggKTsKLSAgICAgICAgICAgICAgICAgICAgU2F2ZVByZXNldERpYWxvZy50aGlzLnNldHRpbmdzLnB1dCggSEVJR0hULCBzaXplLnkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICBuYW1lTGFiZWwuc2V0VGV4dCggUmVzb3VyY2VzLm5hbWVMYWJlbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5uYW1lVGV4dEZpZWxkID0gbmV3IFRleHQoIGNvbXBvc2l0ZSwgU1dULk5PTkUgfCBTV1QuQk9SREVSICk7Ci0gICAgICAgIHRoaXMubmFtZVRleHRGaWVsZC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubmFtZVRleHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoIGZpbmFsIE1vZGlmeUV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExhYmVsIGRlc2NMYWJlbCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICBkZXNjTGFiZWwuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGRlc2NMYWJlbC5zZXRUZXh0KCBSZXNvdXJjZXMuZGVzY0xhYmVsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlc2NUZXh0RmllbGQgCi0gICAgICAgICAgICA9IG5ldyBUZXh0KCBjb21wb3NpdGUsIFNXVC5OT05FIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlc2NUZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZGVzY1RleHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoIGZpbmFsIE1vZGlmeUV2ZW50IGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVzY3JpcHRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1zZ0xhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIHRoaXMubXNnTGFiZWwuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIHRoaXMubXNnTGFiZWwuc2V0Rm9yZWdyb3VuZCggY29sb3IoIFNXVC5DT0xPUl9SRUQgKSApOwotICAgICAgICAKLSAgICAgICAgaGFuZGxlTmFtZUNoYW5nZSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5hbWVDaGFuZ2UoKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lVGV4dEZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIG9rQnV0dG9uRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNvbmZsaWN0RGV0ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLm5hbWUubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHByZXNldC5nZXRMYWJlbCgpLmVxdWFscyggdGhpcy5uYW1lICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmxpY3REZXRlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgY29uZmxpY3REZXRlY3RlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2tCdXR0b25FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGNvbmZsaWN0RGV0ZWN0ZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1zZ0xhYmVsLnNldFRleHQoIFJlc291cmNlcy5uYW1lSW5Vc2VNZXNzYWdlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1zZ0xhYmVsLnNldFRleHQoICIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2V0T2tCdXR0b25FbmFibGVkKCBva0J1dHRvbkVuYWJsZWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2NyaXB0aW9uQ2hhbmdlKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NUZXh0RmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldE9rQnV0dG9uRW5hYmxlZCggZmluYWwgYm9vbGVhbiBlbmFibGVkICkKLSAgICB7Ci0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBnZXRCdXR0b24oIElEaWFsb2dDb25zdGFudHMuT0tfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBidXR0b24gIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1dHRvbi5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgYnV0dG9uIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCAodGhpcyBoYXBwZW5zIGR1cmluZyB0aGUKLSAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiBvZiB0aGUgY3JlYXRlRGlhbG9nQXJlYSBtZXRob2QpLCBzcGluIG9mZiBhIHRocmVhZCB0bwotICAgICAgICAgICAgLy8gd2FpdCBmb3IgaXQncyBjcmVhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1dHRvbiBiID0gZ2V0QnV0dG9uKCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB3aGlsZSggYiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKCA1MCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBiID0gZ2V0QnV0dG9uKCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1dHRvbiBmaW5hbEJ1dHRvbiA9IGI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEJ1dHRvbi5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RmaWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZERhdGEoIFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEdyaWREYXRhIGdkaGZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IgY29sb3IoIGZpbmFsIGludCBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoIGlkICk7ICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjTGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVJblVzZU1lc3NhZ2U7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBTYXZlUHJlc2V0RGlhbG9nLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TYXZlUHJlc2V0RGlhbG9nLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1NhdmVQcmVzZXREaWFsb2cucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiMDA2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1NhdmVQcmVzZXREaWFsb2cucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZGlhbG9nVGl0bGUgPSBTYXZlIFByZXNldAotbmFtZUxhYmVsID0gTmFtZToKLWRlc2NMYWJlbCA9IERlc2NyaXB0aW9uOgotbmFtZUluVXNlTWVzc2FnZSA9IFNlbGVjdGVkIG5hbWUgYWxyZWFkeSBpbiB1c2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1NoYXJlZFdvcmtpbmdDb3B5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TaGFyZWRXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkNWM4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1NoYXJlZFdvcmtpbmdDb3B5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU2hhcmVkV29ya2luZ0NvcHlNYW5hZ2VyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPElGYWNldGVkUHJvamVjdCxJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weT4gc2hhcmVkV29ya2luZ0NvcGllcwotICAgICAgICA9IG5ldyBIYXNoTWFwPElGYWNldGVkUHJvamVjdCxJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weT4oKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SUZhY2V0ZWRQcm9qZWN0LEludGVnZXI+IHNoYXJlZFdvcmtpbmdDb3B5VXNlckNvdW50Ci0gICAgICAgID0gbmV3IEhhc2hNYXA8SUZhY2V0ZWRQcm9qZWN0LEludGVnZXI+KCk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZ2V0V29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gc2hhcmVkV29ya2luZ0NvcGllcy5nZXQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmcGp3YyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHVzZXJDb3VudCA9IHNoYXJlZFdvcmtpbmdDb3B5VXNlckNvdW50LmdldCggcHJvamVjdCApOwotICAgICAgICAgICAgc2hhcmVkV29ya2luZ0NvcHlVc2VyQ291bnQucHV0KCBwcm9qZWN0LCB1c2VyQ291bnQgKyAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmcGp3YyA9IHByb2plY3QuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgICAgICAgIHNoYXJlZFdvcmtpbmdDb3BpZXMucHV0KCBwcm9qZWN0LCBmcGp3YyApOwotICAgICAgICAgICAgc2hhcmVkV29ya2luZ0NvcHlVc2VyQ291bnQucHV0KCBwcm9qZWN0LCAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmcGp3YzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlV29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gc2hhcmVkV29ya2luZ0NvcGllcy5nZXQoIHByb2plY3QgKTsKLSAgICAgICAgZmluYWwgaW50IHVzZXJzQ291bnQgPSBzaGFyZWRXb3JraW5nQ29weVVzZXJDb3VudC5nZXQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB1c2Vyc0NvdW50ID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGFyZWRXb3JraW5nQ29waWVzLnJlbW92ZSggcHJvamVjdCApOwotICAgICAgICAgICAgc2hhcmVkV29ya2luZ0NvcHlVc2VyQ291bnQucmVtb3ZlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICBmcGp3Yy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGFyZWRXb3JraW5nQ29weVVzZXJDb3VudC5wdXQoIHByb2plY3QsIHVzZXJzQ291bnQgLSAxICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvQ29uc3RyYWludE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGUwODE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvQ29uc3RyYWludE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuY29uc3RyYWludHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0cmFpbnRPcGVyYXRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlCi0gICAgewotICAgICAgICBBTkQsCi0gICAgICAgIE9SLAotICAgICAgICBSRVFVSVJFU19BTEwsCi0gICAgICAgIFJFUVVJUkVTX09ORSwKLSAgICAgICAgQ09ORkxJQ1RTCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgVHlwZSB0eXBlOwotICAgIAotICAgIHByb3RlY3RlZCBDb25zdHJhaW50T3BlcmF0b3IoIGZpbmFsIFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoIGZpbmFsIFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvQ29uc3RyYWludFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvQ29uc3RyYWludFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1ODI3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5Qcm9qZWN0RmFjZXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5WZXJzaW9uRXhwcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RyYWludFV0aWwKLXsKLSAgICBwcml2YXRlIENvbnN0cmFpbnRVdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbnN0cmFpbnRPcGVyYXRvciBjb252ZXJ0KCBmaW5hbCBJQ29uc3RyYWludCBpbnB1dENvbnN0cmFpbnQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBpbnB1dENvbnN0cmFpbnRUeXBlID0gaW5wdXRDb25zdHJhaW50LmdldFR5cGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpbnB1dENvbnN0cmFpbnRUeXBlID09IElDb25zdHJhaW50LlR5cGUuQU5EIHx8Ci0gICAgICAgICAgICBpbnB1dENvbnN0cmFpbnRUeXBlID09IElDb25zdHJhaW50LlR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb25zdHJhaW50T3BlcmF0b3IuVHlwZSBvdXRwdXRDb25zdHJhaW50VHlwZSAKLSAgICAgICAgICAgICAgICA9ICggaW5wdXRDb25zdHJhaW50VHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCAKLSAgICAgICAgICAgICAgICAgICAgPyBDb25zdHJhaW50T3BlcmF0b3IuVHlwZS5BTkQgOiBDb25zdHJhaW50T3BlcmF0b3IuVHlwZS5PUiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBHcm91cGluZ0NvbnN0cmFpbnRPcGVyYXRvciBvdXRwdXRDb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgPSBuZXcgR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IoIG91dHB1dENvbnN0cmFpbnRUeXBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggT2JqZWN0IGNoaWxkIDogaW5wdXRDb25zdHJhaW50LmdldE9wZXJhbmRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dENvbnN0cmFpbnQuYWRkQ2hpbGQoIGNvbnZlcnQoIChJQ29uc3RyYWludCkgY2hpbGQgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gb3V0cHV0Q29uc3RyYWludDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBpbnB1dENvbnN0cmFpbnRUeXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gaW5wdXRDb25zdHJhaW50LmdldE9wZXJhbmQoIDAgKTsKLQotICAgICAgICAgICAgZmluYWwgTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvciBvdXRwdXRDb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgPSBuZXcgTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvciggQ29uc3RyYWludE9wZXJhdG9yLlR5cGUuUkVRVUlSRVNfT05FICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIGlucHV0Q29uc3RyYWludC5nZXRPcGVyYW5kKCAxICk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Q29uc3RyYWludC5hZGRQcm9qZWN0RmFjZXRSZWYoIG5ldyBQcm9qZWN0RmFjZXRSZWYoIGYsIHZleHByICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSAoSUdyb3VwKSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Q29uc3RyYWludC5hZGRQcm9qZWN0RmFjZXRSZWZzKCBjb252ZXJ0R3JvdXBUb0ZhY2V0UmVmcyggZ3JvdXAgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gb3V0cHV0Q29uc3RyYWludDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBpbnB1dENvbnN0cmFpbnRUeXBlID09IElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpcnN0T3BlcmFuZCA9IGlucHV0Q29uc3RyYWludC5nZXRPcGVyYW5kKCAwICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3Igb3V0cHV0Q29uc3RyYWludAotICAgICAgICAgICAgICAgID0gbmV3IE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IoIENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLkNPTkZMSUNUUyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmlyc3RPcGVyYW5kIGluc3RhbmNlb2YgSVByb2plY3RGYWNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKElQcm9qZWN0RmFjZXQpIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgPSAoSVZlcnNpb25FeHByKSBpbnB1dENvbnN0cmFpbnQuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgIG91dHB1dENvbnN0cmFpbnQuYWRkUHJvamVjdEZhY2V0UmVmKCBuZXcgUHJvamVjdEZhY2V0UmVmKCBmLCB2ZXhwciApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gKElHcm91cCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIG91dHB1dENvbnN0cmFpbnQuYWRkUHJvamVjdEZhY2V0UmVmcyggY29udmVydEdyb3VwVG9GYWNldFJlZnMoIGdyb3VwICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG91dHB1dENvbnN0cmFpbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBpbnB1dENvbnN0cmFpbnRUeXBlLm5hbWUoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248UHJvamVjdEZhY2V0UmVmPiBjb252ZXJ0R3JvdXBUb0ZhY2V0UmVmcyggZmluYWwgSUdyb3VwIGdyb3VwICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0LExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+PiBtZW1iZXJzCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPElQcm9qZWN0RmFjZXQsTGlzdDxJUHJvamVjdEZhY2V0VmVyc2lvbj4+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICBMaXN0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXJzaW9ucyA9IG1lbWJlcnMuZ2V0KCBmICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB2ZXJzaW9ucyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgbWVtYmVycy5wdXQoIGYsIHZlcnNpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZlcnNpb25zLmFkZCggZnYgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8UHJvamVjdEZhY2V0UmVmPiBmYWNldFJlZnMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RGYWNldFJlZj4oIG1lbWJlcnMuc2l6ZSgpICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIE1hcC5FbnRyeTxJUHJvamVjdEZhY2V0LExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+PiBlbnRyeSA6IG1lbWJlcnMuZW50cnlTZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmVyc2lvbnMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZleHByU3RyaW5nOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdmVyc2lvbnMuc2l6ZSgpID09IGYuZ2V0VmVyc2lvbnMoKS5zaXplKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZleHByU3RyaW5nID0gSVZlcnNpb25FeHByLldJTERDQVJEX1NZTUJPTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHZlcnNpb25zICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBidWYubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJywnICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2ZXhwclN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZleHByID0gbmV3IFZlcnNpb25FeHByPElQcm9qZWN0RmFjZXRWZXJzaW9uPiggZiwgdmV4cHJTdHJpbmcsIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZhY2V0UmVmcy5hZGQoIG5ldyBQcm9qZWN0RmFjZXRSZWYoIGYsIHZleHByICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhY2V0UmVmczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDb25zdHJhaW50T3BlcmF0b3Igbm9ybWFsaXplKCBmaW5hbCBDb25zdHJhaW50T3BlcmF0b3IgaW5wdXQgKQotICAgIHsKLSAgICAgICAgaWYoIGlucHV0IGluc3RhbmNlb2YgR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PENvbnN0cmFpbnRPcGVyYXRvcj4gb2xkQ2hpbGRyZW4gPSAoIChHcm91cGluZ0NvbnN0cmFpbnRPcGVyYXRvcikgaW5wdXQgKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxDb25zdHJhaW50T3BlcmF0b3I+IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDb25zdHJhaW50T3BlcmF0b3I+KCBvbGRDaGlsZHJlbi5zaXplKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBDb25zdHJhaW50T3BlcmF0b3IgY2hpbGQgOiBvbGRDaGlsZHJlbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4uYWRkKCBub3JtYWxpemUoIGNoaWxkICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGlucHV0LmdldFR5cGUoKSA9PSBDb25zdHJhaW50T3BlcmF0b3IuVHlwZS5BTkQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIENhbiBtZXJnZSBhbnkgUkVRVUlSRVNfQUxMIG9wZXJhdG9ycyB1bmRlciBhbiBBTkQuIE5vdGUgdGhhdCBhIFJFUVVJUkVTX09ORSB3aXRoCi0gICAgICAgICAgICAgICAgLy8gYSBzaW5nbGUgZmFjZXQgY2FuIGJlIHRyZWF0ZWQgYXMgUkVRVUlSRVNfQUxMLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgZmlyc3RSZXF1aXJlc0FsbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvcjxDb25zdHJhaW50T3BlcmF0b3I+IGl0ciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBvcCA9IGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggb3AuZ2V0VHlwZSgpID09IENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLlJFUVVJUkVTX0FMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCBvcC5nZXRUeXBlKCkgPT0gQ29uc3RyYWludE9wZXJhdG9yLlR5cGUuUkVRVUlSRVNfT05FICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICggKE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IpIG9wICkuZ2V0UHJvamVjdEZhY2V0UmVmcygpLnNpemUoKSA9PSAxICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yIG1mb3AgPSAoTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvcikgb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdFJlcXVpcmVzQWxsID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVxdWlyZXNBbGwgPSBtZm9wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVxdWlyZXNBbGwuYWRkUHJvamVjdEZhY2V0UmVmcyggbWZvcC5nZXRQcm9qZWN0RmFjZXRSZWZzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGZpcnN0UmVxdWlyZXNBbGwgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXF1aXJlc0FsbC5nZXRUeXBlKCkgPT0gQ29uc3RyYWludE9wZXJhdG9yLlR5cGUuUkVRVUlSRVNfT05FICYmIAotICAgICAgICAgICAgICAgICAgICBmaXJzdFJlcXVpcmVzQWxsLmdldFByb2plY3RGYWNldFJlZnMoKS5zaXplKCkgPiAxICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0UmVxdWlyZXNBbGwuc2V0VHlwZSggQ29uc3RyYWludE9wZXJhdG9yLlR5cGUuUkVRVUlSRVNfQUxMICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENhbiBtZXJnZSBhbnkgQ09ORkxJQ1RTIG9wZXJhdG9ycyB1bmRlciBhbiBBTkQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvciBmaXJzdENvbmZsaWN0cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvcjxDb25zdHJhaW50T3BlcmF0b3I+IGl0ciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBvcCA9IGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggb3AuZ2V0VHlwZSgpID09IENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLkNPTkZMSUNUUyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgbWZvcCA9IChNdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yKSBvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0Q29uZmxpY3RzID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29uZmxpY3RzID0gbWZvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbmZsaWN0cy5hZGRQcm9qZWN0RmFjZXRSZWZzKCBtZm9wLmdldFByb2plY3RGYWNldFJlZnMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDYW4gbWVyZ2UgYW55IFJFUVVJUkVTX09ORSBvcGVyYXRvcnMgdW5kZXIgYW4gT1IgdGhhdCBoYXZlIG9ubHkgb25lIGNoaWxkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgZmlyc3RSZXF1aXJlc09uZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvcjxDb25zdHJhaW50T3BlcmF0b3I+IGl0ciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBvcCA9IGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggb3AuZ2V0VHlwZSgpID09IENvbnN0cmFpbnRPcGVyYXRvci5UeXBlLlJFUVVJUkVTX09ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IgbWZvcCA9IChNdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yKSBvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0UmVxdWlyZXNPbmUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXF1aXJlc09uZSA9IG1mb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXF1aXJlc09uZS5hZGRQcm9qZWN0RmFjZXRSZWZzKCBtZm9wLmdldFByb2plY3RGYWNldFJlZnMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIG5ld0NoaWxkcmVuLnNpemUoKSA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGRyZW4uZ2V0KCAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3Igb3V0cHV0ID0gbmV3IEdyb3VwaW5nQ29uc3RyYWludE9wZXJhdG9yKCBpbnB1dC5nZXRUeXBlKCkgKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuYWRkQ2hpbGRyZW4oIG5ld0NoaWxkcmVuICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExODM4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL2NvbnN0cmFpbnRzL0dyb3VwaW5nQ29uc3RyYWludE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IKLQotICAgIGV4dGVuZHMgQ29uc3RyYWludE9wZXJhdG9yCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnN0cmFpbnRPcGVyYXRvcj4gY2hpbGRyZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnN0cmFpbnRPcGVyYXRvcj4gY2hpbGRyZW5SZWFkT25seTsKLSAgICAKLSAgICBwdWJsaWMgR3JvdXBpbmdDb25zdHJhaW50T3BlcmF0b3IoIGZpbmFsIFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICBzdXBlciggdHlwZSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Q29uc3RyYWludE9wZXJhdG9yPigpOwotICAgICAgICB0aGlzLmNoaWxkcmVuUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCB0aGlzLmNoaWxkcmVuICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PENvbnN0cmFpbnRPcGVyYXRvcj4gZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5SZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBjaGlsZCApCi0gICAgewotICAgICAgICB0aGlzLmNoaWxkcmVuLmFkZCggY2hpbGQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oIGZpbmFsIENvbGxlY3Rpb248Q29uc3RyYWludE9wZXJhdG9yPiBjaGlsZHJlbiApCi0gICAgewotICAgICAgICB0aGlzLmNoaWxkcmVuLmFkZEFsbCggY2hpbGRyZW4gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoIGZpbmFsIENvbnN0cmFpbnRPcGVyYXRvciBjaGlsZCApCi0gICAgewotICAgICAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZSggY2hpbGQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oIGZpbmFsIENvbGxlY3Rpb248Q29uc3RyYWludE9wZXJhdG9yPiBjaGlsZHJlbiApCi0gICAgewotICAgICAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZUFsbCggY2hpbGRyZW4gKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL2NvbnN0cmFpbnRzL011bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZlNWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvY29uc3RyYWludHMvTXVsdGlGYWNldENvbnN0cmFpbnRPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5Qcm9qZWN0RmFjZXRSZWY7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpRmFjZXRDb25zdHJhaW50T3BlcmF0b3IKLQotICAgIGV4dGVuZHMgQ29uc3RyYWludE9wZXJhdG9yCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb2plY3RGYWNldFJlZj4gZmFjZXRSZWZzOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9qZWN0RmFjZXRSZWY+IGZhY2V0UmVmc1JlYWRPbmx5OwotICAgIAotICAgIHB1YmxpYyBNdWx0aUZhY2V0Q29uc3RyYWludE9wZXJhdG9yKCBmaW5hbCBUeXBlIHR5cGUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHR5cGUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmFjZXRSZWZzID0gbmV3IEFycmF5TGlzdDxQcm9qZWN0RmFjZXRSZWY+KCk7Ci0gICAgICAgIHRoaXMuZmFjZXRSZWZzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCB0aGlzLmZhY2V0UmVmcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxQcm9qZWN0RmFjZXRSZWY+IGdldFByb2plY3RGYWNldFJlZnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRSZWZzUmVhZE9ubHk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3RGYWNldFJlZiggZmluYWwgUHJvamVjdEZhY2V0UmVmIGZhY2V0UmVmICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmFjZXRSZWZzLmFkZCggZmFjZXRSZWYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkUHJvamVjdEZhY2V0UmVmcyggZmluYWwgQ29sbGVjdGlvbjxQcm9qZWN0RmFjZXRSZWY+IGZhY2V0UmVmcyApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0UmVmcy5hZGRBbGwoIGZhY2V0UmVmcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXRSZWYoIGZpbmFsIFByb2plY3RGYWNldFJlZiBmYWNldFJlZiApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0UmVmcy5yZW1vdmUoIGZhY2V0UmVmICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3RGYWNldFJlZnMoIGZpbmFsIENvbGxlY3Rpb248UHJvamVjdEZhY2V0UmVmPiBmYWNldFJlZnMgKQotICAgIHsKLSAgICAgICAgdGhpcy5mYWNldFJlZnMucmVtb3ZlQWxsKCBmYWNldFJlZnMgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvQmFzaWNUb29sVGlwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvQmFzaWNUb29sVGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmU5MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0Jhc2ljVG9vbFRpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RmaWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZHdoaW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5Ub29sVGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljVG9vbFRpcAotICAgIAotICAgIGV4dGVuZHMgVG9vbFRpcAotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBCYXNpY1Rvb2xUaXAoIGZpbmFsIENvbnRyb2wgY29udHJvbCApCi0gICAgewotICAgICAgICBzdXBlciggY29udHJvbCApOwotICAgICAgICAKLSAgICAgICAgc2V0UG9wdXBEZWxheSggMTAwMCApOwotICAgICAgICBzZXRTaGlmdCggbmV3IFBvaW50KCAxMCwgMyApICk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb29sVGlwQ29udGVudEFyZWEoIGZpbmFsIEV2ZW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBnbCggMSApICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5XUkFQICk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoIGdkd2hpbnQoIGdkZmlsbCgpLCAzMDAgKSApOwotICAgICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EICkgKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCggdGhpcy5tZXNzYWdlICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZSggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvRW5oYW5jZWRDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9FbmhhbmNlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWFhY2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9FbmhhbmNlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEVuaGFuY2VkQ29tcG9zaXRlCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZQotICAgIAotewotICAgIHB1YmxpYyBFbmhhbmNlZENvbXBvc2l0ZSggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApCi0gICAgewotICAgICAgICB0aGlzKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbmhhbmNlZENvbXBvc2l0ZSggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdHlsZSApCi0gICAgewotICAgICAgICBzdXBlciggcGFyZW50LCBzdHlsZSApOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKCBib29sZWFuIGVuYWJsZWQgKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBDb250cm9sIGNoaWxkIDogZ2V0Q2hpbGRyZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9FbmhhbmNlZEh5cGVybGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0VuaGFuY2VkSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTg3NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0VuaGFuY2VkSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBFbmhhbmNlZEh5cGVybGluawotCi0gICAgZXh0ZW5kcyBIeXBlcmxpbmsKLSAgICAKLXsKLSAgICBwdWJsaWMgRW5oYW5jZWRIeXBlcmxpbmsoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3R5bGUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHBhcmVudCwgc3R5bGUgKTsKLSAgICAgICAgCi0gICAgICAgIHNldFVuZGVybGluZWQoIHRydWUgKTsKLSAgICAgICAgc2V0Rm9yZWdyb3VuZCggZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfREFSS19CTFVFICkgKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZCggZmluYWwgYm9vbGVhbiBlbmFibGVkICkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGludCBjb2xvciA9ICggZW5hYmxlZCA/IFNXVC5DT0xPUl9EQVJLX0JMVUUgOiBTV1QuQ09MT1JfREFSS19HUkFZICk7Ci0gICAgICAgIHNldEZvcmVncm91bmQoIGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvciggY29sb3IgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9HcmlkTGF5b3V0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0dyaWRMYXlvdXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzUwODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0dyaWRMYXlvdXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcmlkTGF5b3V0VXRpbAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZExheW91dCBnbCggZmluYWwgaW50IGNvbHVtbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkTGF5b3V0KCBjb2x1bW5zLCBmYWxzZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWRMYXlvdXQgZ2woIGZpbmFsIGludCBjb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1hcmdpbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1hcmdpbkhlaWdodCApCi0gICAgewotICAgICAgICBmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCBjb2x1bW5zLCBmYWxzZSApOwotCi0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxheW91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWRMYXlvdXQgZ2woIGZpbmFsIGludCBjb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlZnRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9wTWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbU1hcmdpbiApCi0gICAgewotICAgICAgICBmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCBjb2x1bW5zLCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5MZWZ0ID0gbGVmdE1hcmdpbjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpblJpZ2h0ID0gcmlnaHRNYXJnaW47Ci0gICAgICAgIGxheW91dC5tYXJnaW5Ub3AgPSB0b3BNYXJnaW47Ci0gICAgICAgIGxheW91dC5tYXJnaW5Cb3R0b20gPSBib3R0b21NYXJnaW47Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGF5b3V0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZExheW91dCBnbG1hcmdpbnMoIGZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXJnaW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWFyZ2luSGVpZ2h0ICkKLSAgICB7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgICAgICBsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsYXlvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkTGF5b3V0IGdsbWFyZ2lucyggZmluYWwgR3JpZExheW91dCBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlZnRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b3BNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbU1hcmdpbiApCi0gICAgewotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkxlZnQgPSBsZWZ0TWFyZ2luOwotICAgICAgICBsYXlvdXQubWFyZ2luUmlnaHQgPSByaWdodE1hcmdpbjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpblRvcCA9IHRvcE1hcmdpbjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IGJvdHRvbU1hcmdpbjsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsYXlvdXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZExheW91dCBnbHNwYWNpbmcoIGZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBob3Jpem9udGFsU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxTcGFjaW5nICkKLSAgICB7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGhvcml6b250YWxTcGFjaW5nOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxheW91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JpZERhdGEoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZGZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkdmZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9WRVJUSUNBTCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkaGhpbnQoIGZpbmFsIEdyaWREYXRhIGdkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodEhpbnQgKQotICAgIHsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0gICAgICAgIHJldHVybiBnZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZHdoaW50KCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aEhpbnQgKQotICAgIHsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotICAgICAgICByZXR1cm4gZ2Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZERhdGEgZ2RoaW5kZW50KCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhvcml6b250YWxJbmRlbnQgKQotICAgIHsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IGhvcml6b250YWxJbmRlbnQ7Ci0gICAgICAgIHJldHVybiBnZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkdmluZGVudCggZmluYWwgR3JpZERhdGEgZ2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbEluZGVudCApCi0gICAgewotICAgICAgICBnZC52ZXJ0aWNhbEluZGVudCA9IHZlcnRpY2FsSW5kZW50OwotICAgICAgICByZXR1cm4gZ2Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JpZERhdGEgZ2Roc3BhbiggZmluYWwgR3JpZERhdGEgZ2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhbiApCi0gICAgewotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0gICAgICAgIHJldHVybiBnZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkdnNwYW4oIGZpbmFsIEdyaWREYXRhIGdkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNwYW4gKQotICAgIHsKLSAgICAgICAgZ2QudmVydGljYWxTcGFuID0gc3BhbjsKLSAgICAgICAgcmV0dXJuIGdkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkaGFsaWduKCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWxpZ25tZW50ICkKLSAgICB7Ci0gICAgICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgICAgIHJldHVybiBnZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZHZhbGlnbiggZmluYWwgR3JpZERhdGEgZ2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFsaWdubWVudCApCi0gICAgewotICAgICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgICAgICAgcmV0dXJuIGdkOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9IZWFkZXJUb29sVGlwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvSGVhZGVyVG9vbFRpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQ0YjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9IZWFkZXJUb29sVGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWF4OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nZGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkaGZpbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkd2hpbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbG1hcmdpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLlN3dFV0aWwuZ2V0UHJlZmVycmVkV2lkdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuVG9vbFRpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEhlYWRlclRvb2xUaXAKLSAgICAKLSAgICBleHRlbmRzIFRvb2xUaXAKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0JHX0NPTE9SIAotICAgICAgICA9IEhlYWRlclRvb2xUaXAuY2xhc3MuZ2V0TmFtZSgpICsgIi5UT09MVElQX0hFQURfQkdfQ09MT1IiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9GR19DT0xPUiAKLSAgICAgICAgPSBIZWFkZXJUb29sVGlwLmNsYXNzLmdldE5hbWUoKSArICIuVE9PTFRJUF9IRUFEX0ZHX0NPTE9SIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRk9OVCAKLSAgICAgICAgPSBIZWFkZXJUb29sVGlwLmNsYXNzLmdldE5hbWUoKSArICIuVE9PTFRJUF9IRUFEX0ZPTlQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBnZXRDb2xvclJlZ2lzdHJ5KCkucHV0KCBIRUFERVJfQkdfQ09MT1IsIG5ldyBSR0IoIDI1NSwgMjU1LCAyNTUgKSApOwotICAgICAgICBnZXRDb2xvclJlZ2lzdHJ5KCkucHV0KCBIRUFERVJfRkdfQ09MT1IsIG5ldyBSR0IoIDAsIDAsIDAgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRGb250TmFtZSA9IGdldERlZmF1bHRGb250KCkuZ2V0Rm9udERhdGEoKVsgMCBdLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgRm9udERhdGFbXSBmb250RGF0YSA9IGdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoIGRlZmF1bHRGb250TmFtZSApLmdldEZvbnREYXRhKCk7Ci0gICAgICAgIAotICAgICAgICBnZXRGb250UmVnaXN0cnkoKS5wdXQoIEhFQURFUl9GT05ULCBmb250RGF0YSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSGVhZGVyVG9vbFRpcCggZmluYWwgQ29udHJvbCBjb250cm9sICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBjb250cm9sICk7Ci0gICAgICAgIAotICAgICAgICBzZXRQb3B1cERlbGF5KCAxMDAwICk7Ci0gICAgICAgIHNldFNoaWZ0KCBuZXcgUG9pbnQoIDEwLCAzICkgKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGNyZWF0ZVRvb2xUaXBDb250ZW50QXJlYSggZmluYWwgRXZlbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBnbG1hcmdpbnMoIGdsKCAxICksIDAsIDAgKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIGxheW91dCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHRvcEFyZWEgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIHRvcEFyZWEuc2V0QmFja2dyb3VuZCggZ2V0Q29sb3JSZWdpc3RyeSgpLmdldCggSEVBREVSX0JHX0NPTE9SICkgKTsKLSAgICAgICAgdG9wQXJlYS5zZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDMgKSwgNSwgNSwgMiwgMiApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMYWJlbCB0aXRsZUxhYmVsID0gbmV3IExhYmVsKCB0b3BBcmVhLCBTV1QuTk9ORSAgKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICB0aXRsZUxhYmVsLnNldEJhY2tncm91bmQoIGdldENvbG9yUmVnaXN0cnkoKS5nZXQoIEhFQURFUl9CR19DT0xPUiApICk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0Rm9udCggZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KCBIRUFERVJfRk9OVCApICk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0Rm9yZWdyb3VuZCggZ2V0Q29sb3JSZWdpc3RyeSgpLmdldCggSEVBREVSX0ZHX0NPTE9SICkgKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRUZXh0KCBnZXRUb29sVGlwVGl0bGUoIGV2ZW50ICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbnRyb2wgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRBcmVhKCBldmVudCwgY29tcG9zaXRlICk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbWF4KCBnZXRQcmVmZXJyZWRXaWR0aCggdGl0bGVMYWJlbCApICsgNTAsIDMwMCApOwotICAgICAgICB0b3BBcmVhLnNldExheW91dERhdGEoIGdkd2hpbnQoIGdkaGZpbGwoKSwgd2lkdGggKSApOwotICAgICAgICBjb250ZW50LnNldExheW91dERhdGEoIGdkd2hpbnQoIGdkZmlsbCgpLCB3aWR0aCApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRvb2xUaXBUaXRsZSggRXZlbnQgZXZlbnQgKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRBcmVhKCBFdmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50ICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL0ltYWdlV2l0aFRleHRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1YmI1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvSW1hZ2VXaXRoVGV4dENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdkZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2RoZmlsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWwuR3JpZExheW91dFV0aWwuZ2R2YWxpZ247Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbC5HcmlkTGF5b3V0VXRpbC5nbG1hcmdpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsLkdyaWRMYXlvdXRVdGlsLmdsc3BhY2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZVdpdGhUZXh0Q29tcG9zaXRlCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZQotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgTGFiZWwgaW1hZ2VMYWJlbDsKLSAgICBwcml2YXRlIGZpbmFsIFRleHQgdGV4dEZpZWxkOwotICAgIAotICAgIHB1YmxpYyBJbWFnZVdpdGhUZXh0Q29tcG9zaXRlKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIAotICAgICAgICBzZXRMYXlvdXQoIGdsbWFyZ2lucyggZ2woIDEgKSwgMCwgMCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb3NpdGUgaW50ZXJuYWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCB0aGlzLCBTV1QuTk9ORSApOwotICAgICAgICBpbnRlcm5hbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBnZGZpbGwoKSApOwotICAgICAgICBpbnRlcm5hbENvbXBvc2l0ZS5zZXRMYXlvdXQoIGdsc3BhY2luZyggZ2xtYXJnaW5zKCBnbCggMiApLCAwLCAwICksIDUsIDAgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5pbWFnZUxhYmVsID0gbmV3IExhYmVsKCBpbnRlcm5hbENvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5pbWFnZUxhYmVsLnNldExheW91dERhdGEoIGdkdmFsaWduKCBnZCgpLCBTV1QuVE9QICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudGV4dEZpZWxkID0gbmV3IFRleHQoIGludGVybmFsQ29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgdGhpcy50ZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIC8vdGhpcy50ZXh0RmllbGQuc2V0QmFja2dyb3VuZCggZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZSggZmluYWwgSW1hZ2UgaW1hZ2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5pbWFnZUxhYmVsLnNldEltYWdlKCBpbWFnZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KCBmaW5hbCBTdHJpbmcgdGV4dExhYmVsICkKLSAgICB7Ci0gICAgICAgIHRoaXMudGV4dEZpZWxkLnNldFRleHQoIHRleHRMYWJlbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KCBmaW5hbCBGb250IGZvbnQgKQotICAgIHsKLSAgICAgICAgdGhpcy50ZXh0RmllbGQuc2V0Rm9udCggZm9udCApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9Qcm9ibGVtT3ZlcmxheUltYWdlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL1Byb2JsZW1PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmUzZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL1Byb2JsZW1PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuRmFjZXRVaVBsdWdpbi5QTFVHSU5fSUQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvYmxlbU92ZXJsYXlJbWFnZURlc2NyaXB0b3IgCi0KLSAgICBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciAKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURhdGEgSU1HX0RBVEFfRVJST1JfT1ZFUkxBWQotICAgICAgICA9IGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIFBMVUdJTl9JRCwgImltYWdlcy9vdmVybGF5cy9lcnJvci5naWYiICkuZ2V0SW1hZ2VEYXRhKCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGF0YSBJTUdfREFUQV9XQVJOSU5HX09WRVJMQVkKLSAgICAgICAgPSBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCBQTFVHSU5fSUQsICJpbWFnZXMvb3ZlcmxheXMvd2FybmluZy5wbmciICkuZ2V0SW1hZ2VEYXRhKCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgSW1hZ2VEYXRhIGJhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbWFnZURhdGEgb3ZlcmxheTsKLSAgICBwcml2YXRlIGZpbmFsIFBvaW50IHNpemU7Ci0gICAgCi0gICAgcHVibGljIFByb2JsZW1PdmVybGF5SW1hZ2VEZXNjcmlwdG9yKCBmaW5hbCBJbWFnZURlc2NyaXB0b3IgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZXZlcml0eSApIAotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlID0gYmFzZS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgdGhpcy5vdmVybGF5ID0gZ2V0T3ZlcmxheSggc2V2ZXJpdHkgKTsKLSAgICAgICAgdGhpcy5zaXplID0gbmV3IFBvaW50KCB0aGlzLmJhc2Uud2lkdGgsIHRoaXMuYmFzZS5oZWlnaHQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKCBmaW5hbCBpbnQgd2lkdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCApIAotICAgIHsKLSAgICAgICAgZHJhd0ltYWdlKCB0aGlzLmJhc2UsIDAsIDAgKTsKLSAgICAgICAgZHJhd0ltYWdlKCB0aGlzLm92ZXJsYXksIHdpZHRoIC0gdGhpcy5vdmVybGF5LndpZHRoLCBoZWlnaHQgLSB0aGlzLm92ZXJsYXkuaGVpZ2h0ICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNpemU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSW1hZ2VEYXRhIGdldE92ZXJsYXkoIGZpbmFsIGludCBzZXZlcml0eSApCi0gICAgewotICAgICAgICBpZiggc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJTUdfREFUQV9FUlJPUl9PVkVSTEFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJTUdfREFUQV9XQVJOSU5HX09WRVJMQVk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvUmVhZE9ubHlDb21ib0JveENlbGxFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9SZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWNiOGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9SZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVG9tIFNjaGluZGwgPHRvbS5zY2hpbmRsQGJlc3Rzb2x1dGlvbi5hdD4gLSBidWdmaXggaW4gMTc0NzM5Ci0gKiAgICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBtcHJvdmluZyBiZWhhdmlvciBpbiB0aGUgcmVhZC1vbmx5IGNhc2UgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7IC8vIE5vdCB1c2luZyBJQ1UgdG8gc3VwcG9ydCBzdGFuZGFsb25lIEpGYWNlIHNjZW5hcmlvCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyOwotCi0vKioKLSAqIEEgY2VsbCBlZGl0b3IgdGhhdCBwcmVzZW50cyBhIGxpc3Qgb2YgaXRlbXMgaW4gYSBjb21ibyBib3guCi0gKiBUaGUgY2VsbCBlZGl0b3IncyB2YWx1ZSBpcyB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQKLSAqIGl0ZW0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLQotLy8gVGhlIGNvZGUgY29udGFpbmVkIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBjb3BpZWQgZnJvbSBTV1QvSkZhY2UgdG8gZXhwZXJpbWVudAotLy8gd2l0aCBpbXByb3ZpbmcgYmVoYXZpb3Igb2YgdGhlIENvbWJvQm94Q2VsbEVkaXRvciBpbiB0aGUgcmVhZC1vbmx5IGNhc2UuIAotLy8gVGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgY29kZSBoYXZlIGJlZW4gYW5ub3RhdGVkIHdpdGggImtvc3RhIiBjb21tZW50cy4KLS8vIEV2ZW50dWFsbHkgdGhlc2Ugc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIHBhdGNoZXMgZm9yIGluY29ycG9yYXRpb24gYmFjawotLy8gaW50byBTV1QvSkZhY2UuCi0KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvciBleHRlbmRzIENlbGxFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2YgaXRlbXMgdG8gcHJlc2VudCBpbiB0aGUgY29tYm8gYm94LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gaXRlbXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KLSAgICAgKi8KLSAgICBpbnQgc2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1c3RvbSBjb21ibyBib3ggY29udHJvbC4KLSAgICAgKi8KLSAgICBDdXN0b21DQ29tYm8gY29tYm9Cb3g7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IENvbWJvQm94Q2VsbEVkaXRvciBzdHlsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0U3R5bGUgPSBTV1QuTk9ORTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3Igd2l0aCBubyBjb250cm9sIGFuZCBubyAgc3Qgb2YgY2hvaWNlcy4gSW5pdGlhbGx5LAotICAgICAqIHRoZSBjZWxsIGVkaXRvciBoYXMgbm8gY2VsbCB2YWxpZGF0b3IuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqIEBzZWUgQ2VsbEVkaXRvciNzZXRTdHlsZQotICAgICAqIEBzZWUgQ2VsbEVkaXRvciNjcmVhdGUKLSAgICAgKiBAc2VlIFJlYWRPbmx5Q29tYm9Cb3hDZWxsRWRpdG9yI3NldEl0ZW1zCi0gICAgICogQHNlZSBDZWxsRWRpdG9yI2Rpc3Bvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZE9ubHlDb21ib0JveENlbGxFZGl0b3IoKSB7Ci0gICAgICAgIHNldFN0eWxlKGRlZmF1bHRTdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIGEgY29tYm8gY29udGFpbmluZyB0aGUgZ2l2ZW4gCi0gICAgICogbGlzdCBvZiBjaG9pY2VzIGFuZCBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4gVGhlIGNlbGwKLSAgICAgKiBlZGl0b3IgdmFsdWUgaXMgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0uCi0gICAgICogSW5pdGlhbGx5LCB0aGUgY2VsbCBlZGl0b3IgaGFzIG5vIGNlbGwgdmFsaWRhdG9yIGFuZAotICAgICAqIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZE9ubHlDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIGl0ZW1zLCBkZWZhdWx0U3R5bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3Igd2l0aCBhIGNvbWJvIGNvbnRhaW5pbmcgdGhlIGdpdmVuIAotICAgICAqIGxpc3Qgb2YgY2hvaWNlcyBhbmQgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuIFRoZSBjZWxsCi0gICAgICogZWRpdG9yIHZhbHVlIGlzIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLgotICAgICAqIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvciBhbmQKLSAgICAgKiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBwYXJhbSBpdGVtcyB0aGUgbGlzdCBvZiBzdHJpbmdzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBiaXRzCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBSZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBzZXRJdGVtcyhpdGVtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaG9pY2VzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBmb3IgdGhlIGNvbWJvIGJveAotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGl0ZW1zKTsKLSAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotICAgICAgICBwb3B1bGF0ZUNvbWJvQm94SXRlbXMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgdGhpcy5jb21ib0JveCA9IG5ldyBDdXN0b21DQ29tYm8ocGFyZW50LCBnZXRTdHlsZSgpKTsKLSAgICAgICAgdGhpcy5jb21ib0JveC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAKLSAgICAgICAgcG9wdWxhdGVDb21ib0JveEl0ZW1zKCk7Ci0KLSAgICAgICAgdGhpcy5jb21ib0JveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8vIGhvb2sga2V5IHByZXNzZWQgLSBzZWUgUFIgMTQyMDEgIAotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAga2V5UmVsZWFzZU9jY3VyZWQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuY29tYm9Cb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFJlYWRPbmx5Q29tYm9Cb3hDZWxsRWRpdG9yLnRoaXMuc2VsZWN0aW9uID0gUmVhZE9ubHlDb21ib0JveENlbGxFZGl0b3IudGhpcy5jb21ib0JveC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmNvbWJvQm94LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmNvbWJvQm94LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWFkT25seUNvbWJvQm94Q2VsbEVkaXRvci50aGlzLmZvY3VzTG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29tYm9Cb3guYWRkU2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXIobmV3IEN1c3RvbUNDb21iby5TZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lcigpIHsgLy8ga29zdGEKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkZpbmFsaXplZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLmNvbWJvQm94OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db21ib0JveENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhpcyA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMKLSAgICAgKiB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3cmFwcGVkCi0gICAgICogIGFzIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodGhpcy5zZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldEZvY3VzKCkgewotICAgICAgICB0aGlzLmNvbWJvQm94LnNldEZvY3VzKCk7Ci0gICAgICAgIHRoaXMuY29tYm9Cb3guZHJvcERvd24oIHRydWUgKTsgIC8vIGtvc3RhCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2Qgc2V0cyB0aGUgCi0gICAgICogbWluaW11bSB3aWR0aCBvZiB0aGUgY2VsbC4gIFRoZSBtaW5pbXVtIHdpZHRoIGlzIDEwIGNoYXJhY3RlcnMKLSAgICAgKiBpZiA8Y29kZT5jb21ib0JveDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IG9yIDxjb2RlPmRpc3Bvc2VkPC9jb2RlPgotICAgICAqIGVsc2UgaXQgaXMgNjAgcGl4ZWxzIHRvIG1ha2Ugc3VyZSB0aGUgYXJyb3cgYnV0dG9uIGFuZCBzb21lIHRleHQgaXMgdmlzaWJsZS4KLSAgICAgKiBUaGUgbGlzdCBvZiBDQ29tYm8gd2lsbCBiZSB3aWRlIGVub3VnaCB0byBzaG93IGl0cyBsb25nZXN0IGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIExheW91dERhdGEgZ2V0TGF5b3V0RGF0YSgpIHsKLSAgICAgICAgTGF5b3V0RGF0YSBsYXlvdXREYXRhID0gc3VwZXIuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBpZiAoKHRoaXMuY29tYm9Cb3ggPT0gbnVsbCkgfHwgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGxheW91dERhdGEubWluaW11bVdpZHRoID0gNjA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHRoZSBjb21ib0JveCAxMCBjaGFyYWN0ZXJzIHdpZGUKLSAgICAgICAgICAgIEdDIGdjID0gbmV3IEdDKHRoaXMuY29tYm9Cb3gpOwotICAgICAgICAgICAgbGF5b3V0RGF0YS5taW5pbXVtV2lkdGggPSAoZ2MuZ2V0Rm9udE1ldHJpY3MoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogMTApICsgMTA7Ci0gICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxheW91dERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2QKLSAgICAgKiBhY2NlcHRzIGEgemVyby1iYXNlZCBpbmRleCBvZiBhIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VsZWN0aW9uIHdyYXBwZWQKLSAgICAgKiAgIGFzIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZSh0aGlzLmNvbWJvQm94ICE9IG51bGwgJiYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikpOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgIHRoaXMuY29tYm9Cb3guc2VsZWN0KHRoaXMuc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3ggZm9yIHRoZSBjdXJyZW50IGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm9Cb3hJdGVtcygpIHsKLSAgICAgICAgaWYgKHRoaXMuY29tYm9Cb3ggIT0gbnVsbCAmJiB0aGlzLml0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbWJvQm94LmFkZCh0aGlzLml0ZW1zW2ldLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0VmFsdWVWYWxpZCh0cnVlKTsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSBhbmQgZGVhY3RpdmF0ZXMgdGhlIGNlbGwgZWRpdG9yCi0gICAgICovCi0gICAgdm9pZCBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpIHsKLSAgICAgICAgLy8gIG11c3Qgc2V0IHRoZSBzZWxlY3Rpb24gYmVmb3JlIGdldHRpbmcgdmFsdWUKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLmNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IGRvR2V0VmFsdWUoKTsKLSAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzQ29ycmVjdChuZXdWYWx1ZSk7Ci0gICAgICAgIHNldFZhbHVlVmFsaWQoaXNWYWxpZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWlzVmFsaWQpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgZm9ybWF0IGlmIHRoZSAnaW5kZXgnIGlzIHZhbGlkCi0gICAgICAgICAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0aW9uID49IDAgJiYgdGhpcy5zZWxlY3Rpb24gPCB0aGlzLml0ZW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBpbnNlcnQgdGhlIGN1cnJlbnQgdmFsdWUgaW50byB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB0aGlzLml0ZW1zW3RoaXMuc2VsZWN0aW9uXSB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgaW5kZXgsIGFzc3VtZSB3ZSdyZSB1c2luZyBhbiAnZWRpdCcKLSAgICAgICAgICAgICAgICAvLyBjb21ibyBzbyBmb3JtYXQgdXNpbmcgaXRzIHRleHQgdmFsdWUKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB0aGlzLmNvbWJvQm94LmdldFRleHQoKSB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICBkZWFjdGl2YXRlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yI2ZvY3VzTG9zdCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZm9jdXNMb3N0KCkgewotICAgICAgICBpZiAoaXNBY3RpdmF0ZWQoKSkgewotICAgICAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvciNrZXlSZWxlYXNlT2NjdXJlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGtleVJlbGVhc2VPY2N1cmVkKEtleUV2ZW50IGtleUV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlFdmVudC5jaGFyYWN0ZXIgPT0gJ1x1MDAxYicpIHsgLy8gRXNjYXBlIGNoYXJhY3RlcgotICAgICAgICAgICAgZmlyZUNhbmNlbEVkaXRvcigpOwotICAgICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAnXHQnKSB7IC8vIHRhYiBrZXkKLSAgICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uRmluYWxpemVkKCkgLy8ga29zdGEKLSAgICB7Ci0gICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBDQ29tYm8gY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gICAgICogdGhhdCBjb21iaW5lcyBhIHRleHQgZmllbGQgYW5kIGEgbGlzdCBhbmQgaXNzdWVzIG5vdGlmaWNhdGlvbgotICAgICAqIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgotICAgICAqIDxwPgotICAgICAqIENDb21ibyB3YXMgd3JpdHRlbiB0byB3b3JrIGFyb3VuZCBjZXJ0YWluIGxpbWl0YXRpb25zIGluIHRoZSBuYXRpdmUKLSAgICAgKiBjb21ibyBib3guIFNwZWNpZmljYWxseSwgb24gd2luMzIsIHRoZSBoZWlnaHQgb2YgYSBDQ29tYm8gY2FuIGJlIHNldDsKLSAgICAgKiBhdHRlbXB0cyB0byBzZXQgdGhlIGhlaWdodCBvZiBhIENvbWJvIGFyZSBpZ25vcmVkLiBDQ29tYm8gY2FuIGJlIHVzZWQKLSAgICAgKiBhbnl3aGVyZSB0aGF0IGhhdmluZyB0aGUgaW5jcmVhc2VkIGZsZXhpYmlsaXR5IGlzIG1vcmUgaW1wb3J0YW50IHRoYW4KLSAgICAgKiBnZXR0aW5nIG5hdGl2ZSBMJkYsIGJ1dCB0aGUgZGVjaXNpb24gc2hvdWxkIG5vdCBiZSB0YWtlbiBsaWdodGx5LiAKLSAgICAgKiBUaGVyZSBpcyBubyBpcyBubyBzdHJpY3QgcmVxdWlyZW1lbnQgdGhhdCBDQ29tYm8gbG9vayBvciBiZWhhdmUKLSAgICAgKiB0aGUgc2FtZSBhcyB0aGUgbmF0aXZlIGNvbWJvIGJveC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICAgICAqIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYWRkIGNoaWxkcmVuIHRvIGl0LCBvciBzZXQgYSBsYXlvdXQgb24gaXQuCi0gICAgICogPC9wPgotICAgICAqIDxkbD4KLSAgICAgKiA8ZHQ+PGI+U3R5bGVzOjwvYj4KLSAgICAgKiA8ZGQ+Qk9SREVSLCBSRUFEX09OTFksIEZMQVQ8L2RkPgotICAgICAqIDxkdD48Yj5FdmVudHM6PC9iPgotICAgICAqIDxkZD5EZWZhdWx0U2VsZWN0aW9uLCBNb2RpZnksIFNlbGVjdGlvbiwgVmVyaWZ5PC9kZD4KLSAgICAgKiA8L2RsPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUNDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlbGVjdGlvbkZpbmFsaXplZExpc3RlbmVyIGltcGxlbWVudHMgRXZlbnRMaXN0ZW5lciAvLyBrb3N0YQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgVGV4dCB0ZXh0OwotICAgICAgICBMaXN0IGxpc3Q7Ci0gICAgICAgIGludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLSAgICAgICAgU2hlbGwgcG9wdXA7Ci0gICAgICAgIEJ1dHRvbiBhcnJvdzsKLSAgICAgICAgYm9vbGVhbiBoYXNGb2N1czsKLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIsIGZpbHRlcjsKLSAgICAgICAgQ29sb3IgZm9yZWdyb3VuZCwgYmFja2dyb3VuZDsKLSAgICAgICAgRm9udCBmb250OwotICAgICAgICBqYXZhLnV0aWwuTGlzdDxTZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lcj4gc2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXJzOyAvLyBrb3N0YQotICAgICAgICAKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGl0cyBwYXJlbnQKLSAgICAgKiBhbmQgYSBzdHlsZSB2YWx1ZSBkZXNjcmliaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3R5bGUgdmFsdWUgaXMgZWl0aGVyIG9uZSBvZiB0aGUgc3R5bGUgY29uc3RhbnRzIGRlZmluZWQgaW4KLSAgICAgKiBjbGFzcyA8Y29kZT5TV1Q8L2NvZGU+IHdoaWNoIGlzIGFwcGxpY2FibGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMKLSAgICAgKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAgICAgKiAodGhhdCBpcywgdXNpbmcgdGhlIDxjb2RlPmludDwvY29kZT4gInwiIG9wZXJhdG9yKSB0d28gb3IgbW9yZQotICAgICAqIG9mIHRob3NlIDxjb2RlPlNXVDwvY29kZT4gc3R5bGUgY29uc3RhbnRzLiBUaGUgY2xhc3MgZGVzY3JpcHRpb24KLSAgICAgKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICAgICAqIFN0eWxlIGJpdHMgYXJlIGFsc28gaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2Ygd2lkZ2V0IHRvIGNvbnN0cnVjdAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIFNXVCNCT1JERVIKLSAgICAgKiBAc2VlIFNXVCNSRUFEX09OTFkKLSAgICAgKiBAc2VlIFNXVCNGTEFUCi0gICAgICogQHNlZSBXaWRnZXQjZ2V0U3R5bGUoKQotICAgICAqLwotICAgIHB1YmxpYyBDdXN0b21DQ29tYm8gKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlciAocGFyZW50LCBzdHlsZSA9IGNoZWNrU3R5bGUgKHN0eWxlKSk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNlbGVjdGlvbkZpbmFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8U2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXI+KCk7IC8vIGtvc3RhCi0gICAgICAgIAotICAgICAgICBpbnQgdGV4dFN0eWxlID0gU1dULlNJTkdMRTsKLSAgICAgICAgaWYgKChzdHlsZSAmIFNXVC5SRUFEX09OTFkpICE9IDApIHRleHRTdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotICAgICAgICBpZiAoKHN0eWxlICYgU1dULkZMQVQpICE9IDApIHRleHRTdHlsZSB8PSBTV1QuRkxBVDsKLSAgICAgICAgdGhpcy50ZXh0ID0gbmV3IFRleHQgKHRoaXMsIHRleHRTdHlsZSk7Ci0gICAgICAgIGludCBhcnJvd1N0eWxlID0gU1dULkFSUk9XIHwgU1dULkRPV047Ci0gICAgICAgIGlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgYXJyb3dTdHlsZSB8PSBTV1QuRkxBVDsKLSAgICAgICAgdGhpcy5hcnJvdyA9IG5ldyBCdXR0b24gKHRoaXMsIGFycm93U3R5bGUpOwotICAgIAotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChDdXN0b21DQ29tYm8udGhpcy5wb3B1cCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9wdXBFdmVudCAoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChDdXN0b21DQ29tYm8udGhpcy50ZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0RXZlbnQgKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQ3VzdG9tQ0NvbWJvLnRoaXMubGlzdCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdEV2ZW50IChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEN1c3RvbUNDb21iby50aGlzLmFycm93ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICAgICAgICAgICAgICBhcnJvd0V2ZW50IChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEN1c3RvbUNDb21iby50aGlzID09IGV2ZW50LndpZGdldCkgewotICAgICAgICAgICAgICAgICAgICBjb21ib0V2ZW50IChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdldFNoZWxsICgpID09IGV2ZW50LndpZGdldCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9ICgoQ29udHJvbClldmVudC53aWRnZXQpLmdldFNoZWxsICgpOwotICAgICAgICAgICAgICAgIGlmIChzaGVsbCA9PSBDdXN0b21DQ29tYm8udGhpcy5nZXRTaGVsbCAoKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBpbnQgW10gY29tYm9FdmVudHMgPSB7U1dULkRpc3Bvc2UsIFNXVC5Nb3ZlLCBTV1QuUmVzaXplfTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbWJvRXZlbnRzLmxlbmd0aDsgaSsrKSB0aGlzLmFkZExpc3RlbmVyIChjb21ib0V2ZW50cyBbaV0sIHRoaXMubGlzdGVuZXIpOwotICAgICAgICAKLSAgICAgICAgaW50IFtdIHRleHRFdmVudHMgPSB7U1dULkRlZmF1bHRTZWxlY3Rpb24sIFNXVC5LZXlEb3duLCBTV1QuS2V5VXAsIFNXVC5NZW51RGV0ZWN0LCBTV1QuTW9kaWZ5LCBTV1QuTW91c2VEb3duLCBTV1QuTW91c2VVcCwgU1dULlRyYXZlcnNlLCBTV1QuRm9jdXNJbiwgU1dULlZlcmlmeX07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTx0ZXh0RXZlbnRzLmxlbmd0aDsgaSsrKSB0aGlzLnRleHQuYWRkTGlzdGVuZXIgKHRleHRFdmVudHMgW2ldLCB0aGlzLmxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIGludCBbXSBhcnJvd0V2ZW50cyA9IHtTV1QuU2VsZWN0aW9uLCBTV1QuRm9jdXNJbn07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxhcnJvd0V2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5hcnJvdy5hZGRMaXN0ZW5lciAoYXJyb3dFdmVudHMgW2ldLCB0aGlzLmxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZVBvcHVwKG51bGwsIC0xKTsKLSAgICAgICAgaW5pdEFjY2Vzc2libGUoKTsKLSAgICB9Ci0gICAgc3RhdGljIGludCBjaGVja1N0eWxlIChpbnQgc3R5bGUpIHsKLSAgICAgICAgaW50IG1hc2sgPSBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVDsKLSAgICAgICAgcmV0dXJuIHN0eWxlICYgbWFzazsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNhZGQoU3RyaW5nLGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgdGhpcy5saXN0LmFkZCAoc3RyaW5nKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAgICAgKiB6ZXJvLXJlbGF0aXZlIGluZGV4LgotICAgICAqIDxwPgotICAgICAqIE5vdGU6IFRvIGFkZCBhbiBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHVzZSB0aGUKLSAgICAgKiByZXN1bHQgb2YgY2FsbGluZyA8Y29kZT5nZXRJdGVtQ291bnQoKTwvY29kZT4gYXMgdGhlCi0gICAgICogaW5kZXggb3IgdXNlIDxjb2RlPmFkZChTdHJpbmcpPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgaXRlbQotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgKGluY2x1c2l2ZSk8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjYWRkKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICB0aGlzLmxpc3QuYWRkIChzdHJpbmcsIGluZGV4KTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gICAgICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIG1vZGlmaWVkLCBieSBzZW5kaW5nCi0gICAgICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5Nb2RpZnlMaXN0ZW5lcjwvY29kZT4KLSAgICAgKiBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNb2RpZnlMaXN0ZW5lcgotICAgICAqIEBzZWUgI3JlbW92ZU1vZGlmeUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIgKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsKLSAgICAgICAgYWRkTGlzdGVuZXIgKFNXVC5Nb2RpZnksIHR5cGVkTGlzdGVuZXIpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAgICAgKiBiZSBub3RpZmllZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uLCBieSBzZW5kaW5nCi0gICAgICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT4KLSAgICAgKiBpbnRlcmZhY2UuCi0gICAgICogPHA+Ci0gICAgICogPGNvZGU+d2lkZ2V0U2VsZWN0ZWQ8L2NvZGU+IGlzIGNhbGxlZCB3aGVuIHRoZSBjb21ibydzIGxpc3Qgc2VsZWN0aW9uIGNoYW5nZXMuCi0gICAgICogPGNvZGU+d2lkZ2V0RGVmYXVsdFNlbGVjdGVkPC9jb2RlPiBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gRU5URVIgaXMgcHJlc3NlZCB0aGUgY29tYm8ncyB0ZXh0IGFyZWEuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSByZWNlaXZlcidzIHNlbGVjdGlvbgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAqIEBzZWUgI3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICogQHNlZSBTZWxlY3Rpb25FdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsKLSAgICAgICAgYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci0gICAgICAgIGFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gICAgICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIHZlcmlmaWVkLCBieSBzZW5kaW5nCi0gICAgICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5WZXJpZnlMaXN0ZW5lcjwvY29kZT4KLSAgICAgKiBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBWZXJpZnlMaXN0ZW5lcgotICAgICAqIEBzZWUgI3JlbW92ZVZlcmlmeUxpc3RlbmVyCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZlcmlmeUxpc3RlbmVyIChWZXJpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gICAgICAgIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7Ci0gICAgICAgIGFkZExpc3RlbmVyIChTV1QuVmVyaWZ5LHR5cGVkTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lciggU2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXIgbGlzdGVuZXIgKSAvLyBrb3N0YQotICAgIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICB0aGlzLnNlbGVjdGlvbkZpbmFsaXplZExpc3RlbmVycy5hZGQoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZURyb3BEb3duTGlzdGVuZXIoIFNlbGVjdGlvbkZpbmFsaXplZExpc3RlbmVyIGxpc3RlbmVyICkgLy8ga29zdGEKLSAgICB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lciApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXJzKCkgLy8ga29zdGEKLSAgICB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNlbGVjdGlvbkZpbmFsaXplZExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgYXJyb3dFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgICAgICAgICAgIGRyb3BEb3duICghaXNEcm9wcGVkICgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byBhbiBlbXB0eQotICAgICAqIHNlbGVjdGlvbiBzdGFydGluZyBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLiBJZiB0aGUKLSAgICAgKiB0ZXh0IGZpZWxkIGlzIGVkaXRhYmxlLCB0aGlzIGhhcyB0aGUgZWZmZWN0IG9mIHBsYWNpbmcgdGhlCi0gICAgICogaS1iZWFtIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUbyBjbGVhciB0aGUgc2VsZWN0ZWQgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCwgCi0gICAgICogdXNlIDxjb2RlPmRlc2VsZWN0QWxsKCk8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI2Rlc2VsZWN0QWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJTZWxlY3Rpb24gKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgdGhpcy50ZXh0LmNsZWFyU2VsZWN0aW9uICgpOwotICAgICAgICB0aGlzLmxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgfQotICAgIHZvaWQgY29tYm9FdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcHVwICE9IG51bGwgJiYgIXRoaXMucG9wdXAuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVtb3ZlTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCB0aGlzLmxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1cC5kaXNwb3NlICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotICAgICAgICAgICAgICAgIHNoZWxsLnJlbW92ZUxpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgdGhpcy5saXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIHRoaXMuZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB0aGlzLnBvcHVwID0gbnVsbDsgIAotICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IG51bGw7ICAKLSAgICAgICAgICAgICAgICB0aGlzLmxpc3QgPSBudWxsOyAgCi0gICAgICAgICAgICAgICAgdGhpcy5hcnJvdyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNXVC5Nb3ZlOgotICAgICAgICAgICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNXVC5SZXNpemU6Ci0gICAgICAgICAgICAgICAgaW50ZXJuYWxMYXlvdXQgKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gdGhpcy5saXN0LmdldEl0ZW1zICgpOwotICAgICAgICBHQyBnYyA9IG5ldyBHQyAodGhpcy50ZXh0KTsKLSAgICAgICAgaW50IHNwYWNlciA9IGdjLnN0cmluZ0V4dGVudCAoIiAiKS54OyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCB0ZXh0V2lkdGggPSBnYy5zdHJpbmdFeHRlbnQgKHRoaXMudGV4dC5nZXRUZXh0ICgpKS54OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXh0V2lkdGggPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50IChpdGVtc1tpXSkueCwgdGV4dFdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBnYy5kaXNwb3NlICgpOwotICAgICAgICBQb2ludCB0ZXh0U2l6ZSA9IHRoaXMudGV4dC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLSAgICAgICAgUG9pbnQgYXJyb3dTaXplID0gdGhpcy5hcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLSAgICAgICAgUG9pbnQgbGlzdFNpemUgPSB0aGlzLmxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gICAgICAgIGludCBib3JkZXJXaWR0aCA9IGdldEJvcmRlcldpZHRoICgpOwotICAgICAgICAKLSAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXggKHRleHRTaXplLnksIGFycm93U2l6ZS55KTsKLSAgICAgICAgd2lkdGggPSBNYXRoLm1heCAodGV4dFdpZHRoICsgMipzcGFjZXIgKyBhcnJvd1NpemUueCArIDIqYm9yZGVyV2lkdGgsIGxpc3RTaXplLngpOwotICAgICAgICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0gICAgICAgIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQgKHdpZHRoICsgMipib3JkZXJXaWR0aCwgaGVpZ2h0ICsgMipib3JkZXJXaWR0aCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gaXMgY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5ICgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIHRoaXMudGV4dC5jb3B5ICgpOwotICAgIH0KLSAgICB2b2lkIGNyZWF0ZVBvcHVwKFN0cmluZ1tdIGl0ZW1zLCBpbnQgc2VsZWN0aW9uSW5kZXgpIHsgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIHNoZWxsIGFuZCBsaXN0Ci0gICAgICAgIHRoaXMucG9wdXAgPSBuZXcgU2hlbGwgKGdldFNoZWxsICgpLCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotICAgICAgICBpbnQgc3R5bGUgPSBnZXRTdHlsZSAoKTsKLSAgICAgICAgaW50IGxpc3RTdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEw7Ci0gICAgICAgIGlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5GTEFUOwotICAgICAgICBpZiAoKHN0eWxlICYgU1dULlJJR0hUX1RPX0xFRlQpICE9IDApIGxpc3RTdHlsZSB8PSBTV1QuUklHSFRfVE9fTEVGVDsKLSAgICAgICAgaWYgKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKSBsaXN0U3R5bGUgfD0gU1dULkxFRlRfVE9fUklHSFQ7Ci0gICAgICAgIHRoaXMubGlzdCA9IG5ldyBMaXN0ICh0aGlzLnBvcHVwLCBsaXN0U3R5bGUpOwotICAgICAgICBpZiAodGhpcy5mb250ICE9IG51bGwpIHRoaXMubGlzdC5zZXRGb250ICh0aGlzLmZvbnQpOwotICAgICAgICBpZiAodGhpcy5mb3JlZ3JvdW5kICE9IG51bGwpIHRoaXMubGlzdC5zZXRGb3JlZ3JvdW5kICh0aGlzLmZvcmVncm91bmQpOwotICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kICE9IG51bGwpIHRoaXMubGlzdC5zZXRCYWNrZ3JvdW5kICh0aGlzLmJhY2tncm91bmQpOwotICAgIAotICAgICAgICBpbnQgW10gcG9wdXBFdmVudHMgPSB7U1dULkNsb3NlLCBTV1QuUGFpbnQsIFNXVC5EZWFjdGl2YXRlfTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBvcHVwRXZlbnRzLmxlbmd0aDsgaSsrKSB0aGlzLnBvcHVwLmFkZExpc3RlbmVyIChwb3B1cEV2ZW50cyBbaV0sIHRoaXMubGlzdGVuZXIpOwotICAgICAgICBpbnQgW10gbGlzdEV2ZW50cyA9IHtTV1QuTW91c2VVcCwgU1dULlNlbGVjdGlvbiwgU1dULlRyYXZlcnNlLCBTV1QuS2V5RG93biwgU1dULktleVVwLCBTV1QuRm9jdXNJbiwgU1dULkRpc3Bvc2V9OwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdEV2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5saXN0LmFkZExpc3RlbmVyIChsaXN0RXZlbnRzIFtpXSwgdGhpcy5saXN0ZW5lcik7Ci0gICAgCi0gICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB0aGlzLmxpc3Quc2V0SXRlbXMgKGl0ZW1zKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB0aGlzLmxpc3Quc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25JbmRleCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEN1dHMgdGhlIHNlbGVjdGVkIHRleHQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGZpcnN0IGNvcGllZCB0byB0aGUKLSAgICAgKiBjbGlwYm9hcmQgYW5kIHRoZW4gZGVsZXRlZCBmcm9tIHRoZSB3aWRnZXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjdXQgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgdGhpcy50ZXh0LmN1dCAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogRGVzZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZSByZWNlaXZlcidzIAotICAgICAqIGxpc3QuICBJZiB0aGUgaXRlbSBhdCB0aGUgaW5kZXggd2FzIGFscmVhZHkgZGVzZWxlY3RlZCwgaXQgcmVtYWlucwotICAgICAqIGRlc2VsZWN0ZWQuIEluZGljZXMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBkZXNlbGVjdAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc2VsZWN0IChpbnQgaW5kZXgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIHRoaXMubGlzdC5kZXNlbGVjdCAoaW5kZXgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBEZXNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogVG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGZpZWxkLAotICAgICAqIHVzZSA8Y29kZT5jbGVhclNlbGVjdGlvbigpPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNjbGVhclNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsICgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIHRoaXMubGlzdC5kZXNlbGVjdEFsbCAoKTsKLSAgICB9Ci0gICAgdm9pZCBkcm9wRG93biAoYm9vbGVhbiBkcm9wKSB7Ci0gICAgICAgIGRyb3BEb3duKGRyb3AsIHRydWUpOwotICAgIH0KLSAgICB2b2lkIGRyb3BEb3duIChib29sZWFuIGRyb3AsIGJvb2xlYW4gZm9jdXMpIHsKLSAgICAgICAgLyp0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ki8KLSAgICAgICAgaWYgKGRyb3AgPT0gaXNEcm9wcGVkICgpKSByZXR1cm47Ci0gICAgICAgIGlmICghZHJvcCkgewotICAgICAgICAgICAgdGhpcy5wb3B1cC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoIWlzRGlzcG9zZWQgKCkmJiB0aGlzLmFycm93LmlzRm9jdXNDb250cm9sKCkgJiYgZm9jdXMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRleHQuc2V0Rm9jdXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiAoZ2V0U2hlbGwoKSAhPSB0aGlzLnBvcHVwLmdldFBhcmVudCAoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gaXRlbXMgPSB0aGlzLmxpc3QuZ2V0SXRlbXMgKCk7Ci0gICAgICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSB0aGlzLmxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgICAgICB0aGlzLmxpc3QucmVtb3ZlTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCB0aGlzLmxpc3RlbmVyKTsKLSAgICAgICAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgdGhpcy5wb3B1cCA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLmxpc3QgPSBudWxsOwotICAgICAgICAgICAgY3JlYXRlUG9wdXAgKGl0ZW1zLCBzZWxlY3Rpb25JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFBvaW50IHNpemUgPSBnZXRTaXplICgpOwotICAgICAgICBpbnQgaXRlbUNvdW50ID0gdGhpcy5saXN0LmdldEl0ZW1Db3VudCAoKTsKLSAgICAgICAgaXRlbUNvdW50ID0gKGl0ZW1Db3VudCA9PSAwKSA/IHRoaXMudmlzaWJsZUl0ZW1Db3VudCA6IE1hdGgubWluKHRoaXMudmlzaWJsZUl0ZW1Db3VudCwgaXRlbUNvdW50KTsKLSAgICAgICAgaW50IGl0ZW1IZWlnaHQgPSB0aGlzLmxpc3QuZ2V0SXRlbUhlaWdodCAoKSAqIGl0ZW1Db3VudDsKLSAgICAgICAgUG9pbnQgbGlzdFNpemUgPSB0aGlzLmxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBpdGVtSGVpZ2h0LCBmYWxzZSk7Ci0gICAgICAgIHRoaXMubGlzdC5zZXRCb3VuZHMgKDEsIDEsIE1hdGgubWF4IChzaXplLnggLSAyLCBsaXN0U2l6ZS54KSwgbGlzdFNpemUueSk7Ci0gICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSB0aGlzLmxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkgdGhpcy5saXN0LnNldFRvcEluZGV4IChpbmRleCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBsaXN0UmVjdCA9IHRoaXMubGlzdC5nZXRCb3VuZHMgKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBwYXJlbnRSZWN0ID0gZGlzcGxheS5tYXAgKGdldFBhcmVudCAoKSwgbnVsbCwgZ2V0Qm91bmRzICgpKTsKLSAgICAgICAgUG9pbnQgY29tYm9TaXplID0gZ2V0U2l6ZSAoKTsKLSAgICAgICAgUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZ2V0TW9uaXRvciAoKS5nZXRDbGllbnRBcmVhICgpOwotICAgICAgICBpbnQgd2lkdGggPSBNYXRoLm1heCAoY29tYm9TaXplLngsIGxpc3RSZWN0LndpZHRoICsgMik7Ci0gICAgICAgIGludCBoZWlnaHQgPSBsaXN0UmVjdC5oZWlnaHQgKyAyOwotICAgICAgICBpbnQgeCA9IHBhcmVudFJlY3QueDsKLSAgICAgICAgaW50IHkgPSBwYXJlbnRSZWN0LnkgKyBjb21ib1NpemUueTsKLSAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiBkaXNwbGF5UmVjdC55ICsgZGlzcGxheVJlY3QuaGVpZ2h0KSB5ID0gcGFyZW50UmVjdC55IC0gaGVpZ2h0OwotICAgICAgICBpZiAoeCArIHdpZHRoID4gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoKSB4ID0gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoIC0gbGlzdFJlY3Qud2lkdGg7Ci0gICAgICAgIHRoaXMucG9wdXAuc2V0Qm91bmRzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgdGhpcy5wb3B1cC5zZXRWaXNpYmxlICh0cnVlKTsKLSAgICAgICAgaWYgKGZvY3VzKSB0aGlzLmxpc3Quc2V0Rm9jdXMgKCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBsb3dlcmNhc2Ugb2YgdGhlIGZpcnN0IG5vbi0nJicgY2hhcmFjdGVyIGZvbGxvd2luZwotICAgICAqIGFuICcmJyBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vICcmJwotICAgICAqIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZywgcmV0dXJuICdcMCcuCi0gICAgICovCi0gICAgY2hhciBfZmluZE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgcmV0dXJuICdcMCc7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgaW5kZXgrKzsKLSAgICAgICAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuICdcMCc7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZSAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuICdcMCc7Ci0gICAgfQotICAgIC8qIAotICAgICAqIFJldHVybiB0aGUgTGFiZWwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSByZWNlaXZlciBpbiB0aGUgei1vcmRlciwgCi0gICAgICogb3IgbnVsbCBpZiBub25lLiAKLSAgICAgKi8KLSAgICBMYWJlbCBnZXRBc3NvY2lhdGVkTGFiZWwgKCkgewotICAgICAgICBDb250cm9sW10gc2libGluZ3MgPSBnZXRQYXJlbnQgKCkuZ2V0Q2hpbGRyZW4gKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzaWJsaW5ncyBbaV0gPT0gdGhpcykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBzaWJsaW5ncyBbaS0xXSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoTGFiZWwpIHNpYmxpbmdzIFtpLTFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIENvbnRyb2wgW10gZ2V0Q2hpbGRyZW4gKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRyb2wgWzBdOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIGVkaXRhYmxlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmdldEVkaXRhYmxlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuLCB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgbGlzdC4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0Ci0gICAgICogb2YgcmFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVybgotICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEl0ZW0gKGludCBpbmRleCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gdGhpcy5saXN0LmdldEl0ZW0gKGluZGV4KTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJdGVtQ291bnQgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5nZXRJdGVtQ291bnQgKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgYXJlYSB3aGljaCB3b3VsZCBiZSB1c2VkIHRvCi0gICAgICogZGlzcGxheSA8ZW0+b25lPC9lbT4gb2YgdGhlIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEl0ZW1IZWlnaHQgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5nZXRJdGVtSGVpZ2h0ICgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIDxjb2RlPlN0cmluZzwvY29kZT5zIHdoaWNoIGFyZSB0aGUgaXRlbXMKLSAgICAgKiBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdCB0aGUgYWN0dWFsIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSByZWNlaXZlcgotICAgICAqIHRvIG1haW50YWluIGl0cyBsaXN0IG9mIGl0ZW1zLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAgICAgKiBub3QgYWZmZWN0IHRoZSByZWNlaXZlci4gCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgW10gZ2V0SXRlbXMgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5nZXRJdGVtcyAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIncyBsaXN0IGlzIHZpc2libGUsCi0gICAgICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgb25lIG9mIHRoZSByZWNlaXZlcidzIGFuY2VzdG9ycyBpcyBub3QgdmlzaWJsZSBvciBzb21lCi0gICAgICogb3RoZXIgY29uZGl0aW9uIG1ha2VzIHRoZSByZWNlaXZlciBub3QgdmlzaWJsZSwgdGhpcyBtZXRob2QKLSAgICAgKiBtYXkgc3RpbGwgaW5kaWNhdGUgdGhhdCBpdCBpcyBjb25zaWRlcmVkIHZpc2libGUgZXZlbiB0aG91Z2gKLSAgICAgKiBpdCBtYXkgbm90IGFjdHVhbGx5IGJlIHNob3dpbmcuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBsaXN0J3MgdmlzaWJpbGl0eSBzdGF0ZQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRMaXN0VmlzaWJsZSAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICByZXR1cm4gaXNEcm9wcGVkKCk7Ci0gICAgfQotICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRleHQuZ2V0TWVudSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+UG9pbnQ8L2NvZGU+IHdob3NlIHggY29vcmRpbmF0ZSBpcyB0aGUgc3RhcnQKLSAgICAgKiBvZiB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsIGFuZCB3aG9zZSB5Ci0gICAgICogY29vcmRpbmF0ZSBpcyB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24uIFRoZSByZXR1cm5lZCB2YWx1ZXMKLSAgICAgKiBhcmUgemVyby1yZWxhdGl2ZS4gQW4gImVtcHR5IiBzZWxlY3Rpb24gYXMgaW5kaWNhdGVkIGJ5Ci0gICAgICogdGhlIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldFNlbGVjdGlvbiAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmdldFNlbGVjdGlvbiAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgemVyby1yZWxhdGl2ZSBpbmRleCBvZiB0aGUgaXRlbSB3aGljaCBpcyBjdXJyZW50bHkKLSAgICAgKiBzZWxlY3RlZCBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LCBvciAtMSBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4ICgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0U3R5bGUgKCkgewotICAgICAgICBpbnQgc3R5bGUgPSBzdXBlci5nZXRTdHlsZSAoKTsKLSAgICAgICAgc3R5bGUgJj0gflNXVC5SRUFEX09OTFk7Ci0gICAgICAgIGlmICghdGhpcy50ZXh0LmdldEVkaXRhYmxlKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7IAotICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdGV4dAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmdldFRleHQgKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgcmVjZWl2ZXJzJ3MgdGV4dCBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRleHQgaGVpZ2h0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUZXh0SGVpZ2h0ICgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQgKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLnRleHQuZ2V0TGluZUhlaWdodCAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSByZWNlaXZlcidzCi0gICAgICogdGV4dCBmaWVsZCBpcyBjYXBhYmxlIG9mIGhvbGRpbmcuIElmIHRoaXMgaGFzIG5vdCBiZWVuIGNoYW5nZWQKLSAgICAgKiBieSA8Y29kZT5zZXRUZXh0TGltaXQoKTwvY29kZT4sIGl0IHdpbGwgYmUgdGhlIGNvbnN0YW50Ci0gICAgICogPGNvZGU+Q29tYm8uTElNSVQ8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRleHQgbGltaXQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUZXh0TGltaXQgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5nZXRUZXh0TGltaXQgKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSBkcm9wCi0gICAgICogZG93biBwb3J0aW9uIG9mIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgdmlzaWJsZQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZpc2libGVJdGVtQ291bnQgKCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUl0ZW1Db3VudDsKLSAgICB9Ci0gICAgdm9pZCBoYW5kbGVGb2N1cyAoaW50IHR5cGUpIHsKLSAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIHJldHVybjsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRm9jdXMpIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RWRpdGFibGUgKCkpIHRoaXMudGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5oYXNGb2N1cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIHRoaXMubGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIHNoZWxsLmFkZExpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgdGhpcy5saXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIHRoaXMuZmlsdGVyKTsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LmFkZEZpbHRlciAoU1dULkZvY3VzSW4sIHRoaXMuZmlsdGVyKTsKLSAgICAgICAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULkZvY3VzSW4sIGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuRm9jdXNPdXQ6IHsKLSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzRm9jdXMpIHJldHVybjsKLSAgICAgICAgICAgICAgICBDb250cm9sIGZvY3VzQ29udHJvbCA9IGdldERpc3BsYXkgKCkuZ2V0Rm9jdXNDb250cm9sICgpOwotICAgICAgICAgICAgICAgIGlmIChmb2N1c0NvbnRyb2wgPT0gdGhpcy5hcnJvdyB8fCBmb2N1c0NvbnRyb2wgPT0gdGhpcy5saXN0IHx8IGZvY3VzQ29udHJvbCA9PSB0aGlzLnRleHQpIHJldHVybjsKLSAgICAgICAgICAgICAgICB0aGlzLmhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgdGhpcy5saXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIHRoaXMuZmlsdGVyKTsKLSAgICAgICAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULkZvY3VzT3V0LCBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gICAgICogKGluZGV4IDApIHVudGlsIGFuIGl0ZW0gaXMgZm91bmQgdGhhdCBpcyBlcXVhbCB0byB0aGUgCi0gICAgICogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmIG5vIGl0ZW0KLSAgICAgKiBpcyBmb3VuZCwgcmV0dXJucyAtMS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICByZXR1cm4gdGhpcy5saXN0LmluZGV4T2YgKHN0cmluZyk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGdpdmVuLCAKLSAgICAgKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHVudGlsIGFuIGl0ZW0gaXMgZm91bmQgdGhhdCBpcyBlcXVhbAotICAgICAqIHRvIHRoZSBhcmd1bWVudCwgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoYXQgaXRlbS4gSWYKLSAgICAgKiBubyBpdGVtIGlzIGZvdW5kIG9yIHRoZSBzdGFydGluZyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsCi0gICAgICogcmV0dXJucyAtMS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5pbmRleE9mIChzdHJpbmcsIHN0YXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsKLSAgICAgICAgQWNjZXNzaWJsZUFkYXB0ZXIgYWNjZXNzaWJsZUFkYXB0ZXIgPSBuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBnZXRBc3NvY2lhdGVkTGFiZWwgKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cmlwTW5lbW9uaWMgKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRjdXQgPSBudWxsOwotICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsID0gZ2V0QXNzb2NpYXRlZExhYmVsICgpOwotICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbGFiZWwuZ2V0VGV4dCAoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBtbmVtb25pYyA9IF9maW5kTW5lbW9uaWMgKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1uZW1vbmljICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCA9ICJBbHQrIittbmVtb25pYzsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRIZWxwIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQgKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0gICAgICAgIHRoaXMudGV4dC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotICAgICAgICB0aGlzLmxpc3QuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuYXJyb3cuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSBpc0Ryb3BwZWQgKCkgPyBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9DbG9zZSIpIDogU1dULmdldE1lc3NhZ2UgKCJTV1RfT3BlbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSAiQWx0K0Rvd24gQXJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRIZWxwIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQgKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIAotICAgICAgICBnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVUZXh0QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldENhcmV0T2Zmc2V0IChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlLm9mZnNldCA9IEN1c3RvbUNDb21iby50aGlzLnRleHQuZ2V0Q2FyZXRQb3NpdGlvbiAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblJhbmdlKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBvaW50IHNlbCA9IEN1c3RvbUNDb21iby50aGlzLnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZS5vZmZzZXQgPSBzZWwueDsKLSAgICAgICAgICAgICAgICBlLmxlbmd0aCA9IHNlbC55IC0gc2VsLng7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZEF0UG9pbnQgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBvaW50IHRlc3RQb2ludCA9IHRvQ29udHJvbCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIGlmIChnZXRCb3VuZHMgKCkuY29udGFpbnMgKHRlc3RQb2ludCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldExvY2F0aW9uIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMgKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHQgPSBnZXRQYXJlbnQoKS50b0Rpc3BsYXkgKGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpOwotICAgICAgICAgICAgICAgIGUueCA9IHB0Lng7Ci0gICAgICAgICAgICAgICAgZS55ID0gcHQueTsKLSAgICAgICAgICAgICAgICBlLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0gICAgICAgICAgICAgICAgZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0Um9sZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9DT01CT0JPWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0U3RhdGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gQUNDLlNUQVRFX05PUk1BTDsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldFZhbHVlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlLnJlc3VsdCA9IGdldFRleHQgKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIAotICAgICAgICB0aGlzLnRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldFJvbGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gQ3VzdG9tQ0NvbWJvLnRoaXMudGV4dC5nZXRFZGl0YWJsZSAoKSA/IEFDQy5ST0xFX1RFWFQgOiBBQ0MuUk9MRV9MQUJFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgCi0gICAgICAgIHRoaXMuYXJyb3cuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbiAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSBpc0Ryb3BwZWQgKCkgPyBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9DbG9zZSIpIDogU1dULmdldE1lc3NhZ2UgKCJTV1RfT3BlbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGJvb2xlYW4gaXNEcm9wcGVkICgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9wdXAuZ2V0VmlzaWJsZSAoKTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0NvbnRyb2wgKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAodGhpcy50ZXh0LmlzRm9jdXNDb250cm9sICgpIHx8IHRoaXMuYXJyb3cuaXNGb2N1c0NvbnRyb2wgKCkgfHwgdGhpcy5saXN0LmlzRm9jdXNDb250cm9sICgpIHx8IHRoaXMucG9wdXAuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gc3VwZXIuaXNGb2N1c0NvbnRyb2wgKCk7Ci0gICAgfQotICAgIHZvaWQgaW50ZXJuYWxMYXlvdXQgKGJvb2xlYW4gY2hhbmdlZCkgewotICAgICAgICBpZiAoaXNEcm9wcGVkICgpKSBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEgKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0gICAgICAgIGludCBoZWlnaHQgPSByZWN0LmhlaWdodDsKLSAgICAgICAgUG9pbnQgYXJyb3dTaXplID0gdGhpcy5hcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGhlaWdodCwgY2hhbmdlZCk7Ci0gICAgICAgIHRoaXMudGV4dC5zZXRCb3VuZHMgKDAsIDAsIHdpZHRoIC0gYXJyb3dTaXplLngsIGhlaWdodCk7Ci0gICAgICAgIHRoaXMuYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIGFycm93U2l6ZS54LCAwLCBhcnJvd1NpemUueCwgYXJyb3dTaXplLnkpOwotICAgIH0KLSAgICB2b2lkIGxpc3RFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgICAgICAgICAgIGlmIChnZXRTaGVsbCAoKSAhPSB0aGlzLnBvcHVwLmdldFBhcmVudCAoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBpdGVtcyA9IHRoaXMubGlzdC5nZXRJdGVtcyAoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5saXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcHVwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlUG9wdXAgKGl0ZW1zLCBzZWxlY3Rpb25JbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTV1QuRm9jdXNJbjogewotICAgICAgICAgICAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZVVwOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBub3RpZnlTZWxlY3Rpb25GaW5hbGl6ZWRMaXN0ZW5lcnMoKTsgLy8ga29zdGEKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHRoaXMubGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLSAgICAgICAgICAgICAgICB0aGlzLnRleHQuc2V0VGV4dCAodGhpcy5saXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgdGhpcy50ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgICAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLSAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuVHJhdmVyc2U6IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gZXZlbnQuZGV0YWlsOwotICAgICAgICAgICAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICAgICAgICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICAgICAgICAgICAgZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBlLmRldGFpbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULktleVVwOiB7ICAgICAgIAotICAgICAgICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgICAgICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgICAgICAgICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgICAgICAgICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULktleVVwLCBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULktleURvd246IHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBrZXkgY2FuY2VscyBwb3B1cCBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCAmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVAgfHwgZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXJzKCk7IC8vIGtvc3RhCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgICAgICAgICAgIC8vIElmIHNvLCBkbyBub3QgY29udGludWUuCi0gICAgICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIGJyZWFrOwotICAgICAgICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgICAgICAgIGUuY2hhcmFjdGVyID0gZXZlbnQuY2hhcmFjdGVyOwotICAgICAgICAgICAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICAgICAgICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBQYXN0ZXMgdGV4dCBmcm9tIGNsaXBib2FyZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2VsZWN0ZWQgdGV4dCBpcyBkZWxldGVkIGZyb20gdGhlIHdpZGdldAotICAgICAqIGFuZCBuZXcgdGV4dCBpbnNlcnRlZCBmcm9tIHRoZSBjbGlwYm9hcmQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXN0ZSAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICB0aGlzLnRleHQucGFzdGUgKCk7Ci0gICAgfQotICAgIHZvaWQgcG9wdXBFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1dULlBhaW50OgotICAgICAgICAgICAgICAgIC8vIGRyYXcgYmxhY2sgcmVjdGFuZ2xlIGFyb3VuZCBsaXN0Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGxpc3RSZWN0ID0gdGhpcy5saXN0LmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIENvbG9yIGJsYWNrID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBsaXN0UmVjdC53aWR0aCArIDEsIGxpc3RSZWN0LmhlaWdodCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTV1QuQ2xvc2U6Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNXVC5EZWFjdGl2YXRlOgotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQnVnIGluIEdUSy4gV2hlbiB0aGUgYXJyb3cgYnV0dG9uIGlzIHByZXNzZWQgdGhlIHBvcHVwIGNvbnRyb2wgcmVjZWl2ZXMgYQotICAgICAgICAgICAgICAgICAqIGRlYWN0aXZhdGUgZXZlbnQgYW5kIHRoZW4gdGhlIGFycm93IGJ1dHRvbiByZWNlaXZlcyBhIHNlbGVjdGlvbiBldmVudC4gSWYgCi0gICAgICAgICAgICAgICAgICogd2UgaGlkZSB0aGUgcG9wdXAgaW4gdGhlIGRlYWN0aXZhdGUgZXZlbnQsIHRoZSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBzaG93IAotICAgICAgICAgICAgICAgICAqIGl0IGFnYWluLiBUbyBwcmV2ZW50IHRoZSBwb3B1cCBmcm9tIHNob3dpbmcgYWdhaW4sIHdlIHdpbGwgbGV0IHRoZSBzZWxlY3Rpb24gCi0gICAgICAgICAgICAgICAgICogZXZlbnQgb2YgdGhlIGFycm93IGJ1dHRvbiBoaWRlIHRoZSBwb3B1cC4KLSAgICAgICAgICAgICAgICAgKiBJbiBXaW5kb3dzLCBoaWRpbmcgdGhlIHBvcHVwIGR1cmluZyB0aGUgZGVhY3RpdmF0ZSBjYXVzZXMgdGhlIGRlYWN0aXZhdGUgCi0gICAgICAgICAgICAgICAgICogdG8gYmUgY2FsbGVkIHR3aWNlIGFuZCB0aGUgc2VsZWN0aW9uIGV2ZW50IHRvIGJlIGRpc2FwcGVhci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoISJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBQb2ludCBwb2ludCA9IHRoaXMuYXJyb3cudG9Db250cm9sKGdldERpc3BsYXkoKS5nZXRDdXJzb3JMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2l6ZSA9IHRoaXMuYXJyb3cuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY3QuY29udGFpbnMocG9pbnQpKSAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSAgLy9rb3N0YQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2VsZWN0aW9uRmluYWxpemVkTGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5KCkuc3luY0V4ZWMoIHJ1bm5hYmxlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7ICAvL2tvc3RhCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkcm9wRG93bihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHJlZHJhdyAoKSB7Ci0gICAgICAgIHN1cGVyLnJlZHJhdygpOwotICAgICAgICB0aGlzLnRleHQucmVkcmF3KCk7Ci0gICAgICAgIHRoaXMuYXJyb3cucmVkcmF3KCk7Ci0gICAgICAgIGlmICh0aGlzLnBvcHVwLmlzVmlzaWJsZSgpKSB0aGlzLmxpc3QucmVkcmF3KCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHJlZHJhdyAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gYWxsKSB7Ci0gICAgICAgIHN1cGVyLnJlZHJhdyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gICAgICogemVyby1yZWxhdGl2ZSBpbmRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUgKGludCBpbmRleCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICB0aGlzLmxpc3QucmVtb3ZlIChpbmRleCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGl0ZW1zIGZyb20gdGhlIHJlY2VpdmVyJ3MgbGlzdCB3aGljaCBhcmUKLSAgICAgKiBiZXR3ZWVuIHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIHN0YXJ0IGFuZCBlbmQgCi0gICAgICogaW5kaWNlcyAoaW5jbHVzaXZlKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSByYW5nZQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgYXJlIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgdGhpcy5saXN0LnJlbW92ZSAoc3RhcnQsIGVuZCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGl0ZW0KLSAgICAgKiB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LCAKLSAgICAgKiBhbmQgcmVtb3ZlcyB0aGF0IGl0ZW0gZnJvbSB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3Q8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSAoU3RyaW5nIHN0cmluZykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICB0aGlzLmxpc3QucmVtb3ZlIChzdHJpbmcpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGFuZCBjbGVhciB0aGUKLSAgICAgKiBjb250ZW50cyBvZiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gICAgICogPHA+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCAoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHRoaXMudGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5saXN0LnJlbW92ZUFsbCAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAgICAgKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHRleHQgaXMgbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTW9kaWZ5TGlzdGVuZXIKLSAgICAgKiBAc2VlICNhZGRNb2RpZnlMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyIChNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIGxpc3RlbmVyKTsgICAKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAgICAgKiBiZSBub3RpZmllZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICogQHNlZSAjYWRkU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciAoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLGxpc3RlbmVyKTsgIAotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICAgICAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdmVyaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgVmVyaWZ5TGlzdGVuZXIKLSAgICAgKiBAc2VlICNhZGRWZXJpZnlMaXN0ZW5lcgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVWZXJpZnlMaXN0ZW5lciAoVmVyaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICByZW1vdmVMaXN0ZW5lcihTV1QuVmVyaWZ5LCBsaXN0ZW5lcik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlIHJlY2VpdmVyJ3MgCi0gICAgICogbGlzdC4gIElmIHRoZSBpdGVtIGF0IHRoZSBpbmRleCB3YXMgYWxyZWFkeSBzZWxlY3RlZCwgaXQgcmVtYWlucwotICAgICAqIHNlbGVjdGVkLiBJbmRpY2VzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gc2VsZWN0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0IChpbnQgaW5kZXgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICB0aGlzLmxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICB0aGlzLnRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCB0aGlzLmxpc3QuZ2V0SXRlbUNvdW50KCkpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50ZXh0LnNldFRleHQgKHRoaXMubGlzdC5nZXRJdGVtIChpbmRleCkpOwotICAgICAgICAgICAgICAgIHRoaXMudGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5saXN0LnNlbGVjdCAoaW5kZXgpOwotICAgICAgICAgICAgICAgIHRoaXMubGlzdC5zaG93U2VsZWN0aW9uICgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0gICAgICAgIHN1cGVyLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBjb2xvcjsKLSAgICAgICAgaWYgKHRoaXMudGV4dCAhPSBudWxsKSB0aGlzLnRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgICAgIGlmICh0aGlzLmxpc3QgIT0gbnVsbCkgdGhpcy5saXN0LnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICBpZiAodGhpcy5hcnJvdyAhPSBudWxsKSB0aGlzLmFycm93LnNldEJhY2tncm91bmQoY29sb3IpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlZGl0YWJsZSB0aGUgbmV3IGVkaXRhYmxlIHN0YXRlCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVkaXRhYmxlIChib29sZWFuIGVkaXRhYmxlKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICB0aGlzLnRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkIChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgaWYgKHRoaXMucG9wdXAgIT0gbnVsbCkgdGhpcy5wb3B1cC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0gICAgICAgIGlmICh0aGlzLnRleHQgIT0gbnVsbCkgdGhpcy50ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIGlmICh0aGlzLmFycm93ICE9IG51bGwpIHRoaXMuYXJyb3cuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoIWlzRW5hYmxlZCAoKSB8fCAhaXNWaXNpYmxlICgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChpc0ZvY3VzQ29udHJvbCAoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiB0aGlzLnRleHQuc2V0Rm9jdXMgKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEZvbnQgKEZvbnQgZm9udCkgewotICAgICAgICBzdXBlci5zZXRGb250IChmb250KTsKLSAgICAgICAgdGhpcy5mb250ID0gZm9udDsKLSAgICAgICAgdGhpcy50ZXh0LnNldEZvbnQgKGZvbnQpOwotICAgICAgICB0aGlzLmxpc3Quc2V0Rm9udCAoZm9udCk7Ci0gICAgICAgIGludGVybmFsTGF5b3V0ICh0cnVlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gICAgICAgIHRoaXMuZm9yZWdyb3VuZCA9IGNvbG9yOwotICAgICAgICBpZiAodGhpcy50ZXh0ICE9IG51bGwpIHRoaXMudGV4dC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgICAgICAgaWYgKHRoaXMubGlzdCAhPSBudWxsKSB0aGlzLmxpc3Quc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gICAgICAgIGlmICh0aGlzLmFycm93ICE9IG51bGwpIHRoaXMuYXJyb3cuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRleHQgb2YgdGhlIGl0ZW0gaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAgICAgKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHRvIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoaXMgaXMgZXF1aXZhbGVudAotICAgICAqIHRvIDxjb2RlPnJlbW92ZTwvY29kZT4naW5nIHRoZSBvbGQgaXRlbSBhdCB0aGUgaW5kZXgsIGFuZCB0aGVuCi0gICAgICogPGNvZGU+YWRkPC9jb2RlPidpbmcgdGhlIG5ldyBpdGVtIGF0IHRoYXQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyB0ZXh0IGZvciB0aGUgaXRlbQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW0gKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICB0aGlzLmxpc3Quc2V0SXRlbSAoaW5kZXgsIHN0cmluZyk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlY2VpdmVyJ3MgbGlzdCB0byBiZSB0aGUgZ2l2ZW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbXMgdGhlIGFycmF5IG9mIGl0ZW1zCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBhbiBpdGVtIGluIHRoZSBpdGVtcyBhcnJheSBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyAoU3RyaW5nIFtdIGl0ZW1zKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICB0aGlzLmxpc3Quc2V0SXRlbXMgKGl0ZW1zKTsKLSAgICAgICAgaWYgKCF0aGlzLnRleHQuZ2V0RWRpdGFibGUgKCkpIHRoaXMudGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGF5b3V0IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIgdG8gYmUKLSAgICAgKiB0aGUgYXJndW1lbnQgd2hpY2ggbWF5IGJlIG51bGwuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogTm8gTGF5b3V0IGNhbiBiZSBzZXQgb24gdGhpcyBDb250cm9sIGJlY2F1c2UgaXQgYWxyZWFkeQotICAgICAqIG1hbmFnZXMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIGl0cyBjaGlsZHJlbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbGF5b3V0IHRoZSByZWNlaXZlcidzIG5ldyBsYXlvdXQgb3IgbnVsbAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBNYXJrcyB0aGUgcmVjZWl2ZXIncyBsaXN0IGFzIHZpc2libGUgaWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPnRydWU8L2NvZGU+LAotICAgICAqIGFuZCBtYXJrcyBpdCBpbnZpc2libGUgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIElmIG9uZSBvZiB0aGUgcmVjZWl2ZXIncyBhbmNlc3RvcnMgaXMgbm90IHZpc2libGUgb3Igc29tZQotICAgICAqIG90aGVyIGNvbmRpdGlvbiBtYWtlcyB0aGUgcmVjZWl2ZXIgbm90IHZpc2libGUsIG1hcmtpbmcKLSAgICAgKiBpdCB2aXNpYmxlIG1heSBub3QgYWN0dWFsbHkgY2F1c2UgaXQgdG8gYmUgZGlzcGxheWVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHRoZSBuZXcgdmlzaWJpbGl0eSBzdGF0ZQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0ICgpOwotICAgICAgICBkcm9wRG93bih2aXNpYmxlLCBmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0gICAgICAgIHRoaXMudGV4dC5zZXRNZW51KG1lbnUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byB0aGUKLSAgICAgKiByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IHdob3NlIHggY29vcmRpbmF0ZSBpcyB0aGUKLSAgICAgKiBzdGFydCBvZiB0aGUgc2VsZWN0aW9uIGFuZCB3aG9zZSB5IGNvb3JkaW5hdGUgaXMgdGhlIGVuZAotICAgICAqIG9mIHRoZSBzZWxlY3Rpb24uIAotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiBhIHBvaW50IHJlcHJlc2VudGluZyB0aGUgbmV3IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcG9pbnQgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uIChQb2ludCBzZWxlY3Rpb24pIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgdGhpcy50ZXh0LnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byB0aGUKLSAgICAgKiBnaXZlbiBzdHJpbmcuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogVGhlIHRleHQgZmllbGQgaW4gYSA8Y29kZT5Db21ibzwvY29kZT4gaXMgdHlwaWNhbGx5Ci0gICAgICogb25seSBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LiBUaHVzLAotICAgICAqIHNldHRpbmcgdGhlIHRleHQgdG8gYSBzdHJpbmcgY29udGFpbmluZyBsaW5lIGJyZWFrcyBvcgotICAgICAqIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyB3aWxsIHByb2JhYmx5IGNhdXNlIGl0IHRvIAotICAgICAqIGRpc3BsYXkgaW5jb3JyZWN0bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dCAoU3RyaW5nIHN0cmluZykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICBpbnQgaW5kZXggPSB0aGlzLmxpc3QuaW5kZXhPZiAoc3RyaW5nKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICB0aGlzLmxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICB0aGlzLnRleHQuc2V0VGV4dCAoc3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRleHQuc2V0VGV4dCAoc3RyaW5nKTsKLSAgICAgICAgdGhpcy50ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgICAgdGhpcy5saXN0LnNldFNlbGVjdGlvbiAoaW5kZXgpOwotICAgICAgICB0aGlzLmxpc3Quc2hvd1NlbGVjdGlvbiAoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSByZWNlaXZlcidzCi0gICAgICogdGV4dCBmaWVsZCBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgdG8gYmUgdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbWl0IG5ldyB0ZXh0IGxpbWl0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX0NBTk5PVF9CRV9aRVJPIC0gaWYgdGhlIGxpbWl0IGlzIHplcm88L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHRMaW1pdCAoaW50IGxpbWl0KSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHRoaXMudGV4dC5zZXRUZXh0TGltaXQgKGxpbWl0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQgKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgc3VwZXIuc2V0VG9vbFRpcFRleHQoc3RyaW5nKTsKLSAgICAgICAgdGhpcy5hcnJvdy5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsKLSAgICAgICAgdGhpcy50ZXh0LnNldFRvb2xUaXBUZXh0IChzdHJpbmcpOyAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIC8qIAotICAgICAgICAgKiBBdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZCBpbiBhIEZvY3VzT3V0IGV2ZW50LgotICAgICAgICAgKiBJZiBzbyB0aGVuIGRvIG5vdCBjb250aW51ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0gICAgICAgIGlmICghdmlzaWJsZSkgdGhpcy5wb3B1cC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUgaW4gdGhlIGRyb3AKLSAgICAgKiBkb3duIHBvcnRpb24gb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb3VudCB0aGUgbmV3IG51bWJlciBvZiBpdGVtcyB0byBiZSB2aXNpYmxlCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGVJdGVtQ291bnQgKGludCBjb3VudCkgewotICAgICAgICBjaGVja1dpZGdldCAoKTsKLSAgICAgICAgaWYgKGNvdW50IDwgMCkgcmV0dXJuOwotICAgICAgICB0aGlzLnZpc2libGVJdGVtQ291bnQgPSBjb3VudDsKLSAgICB9Ci0gICAgU3RyaW5nIHN0cmlwTW5lbW9uaWMgKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGggKCk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSkgaW5kZXgrKzsKLSAgICAgICAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuIHN0cmluZzsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgtMSkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfSB3aGlsZSAoaW5kZXggPCBsZW5ndGgpOwotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLSAgICB2b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULkRlZmF1bHRTZWxlY3Rpb246IHsKLSAgICAgICAgICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgICAgICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgICAgICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULktleURvd246IHsKLSAgICAgICAgICAgICAgICBFdmVudCBrZXlFdmVudCA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgICAgICAgICBrZXlFdmVudC50aW1lID0gZXZlbnQudGltZTsKLSAgICAgICAgICAgICAgICBrZXlFdmVudC5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICAgICAgICAgICAga2V5RXZlbnQua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICAgICAgICAgICAga2V5RXZlbnQuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULktleURvd24sIGtleUV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoaXNEaXNwb3NlZCAoKSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGtleUV2ZW50LmRvaXQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFldmVudC5kb2l0KSBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVAgfHwgZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikgewotICAgICAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkcm9wcGVkID0gaXNEcm9wcGVkICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZHJvcHBlZCkgc2V0Rm9jdXMgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IChNYXRoLm1heCAob2xkSW5kZXggLSAxLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgKE1hdGgubWluIChvbGRJbmRleCArIDEsIGdldEl0ZW1Db3VudCAoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob2xkSW5kZXggIT0gZ2V0U2VsZWN0aW9uSW5kZXggKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBGdXJ0aGVyIHdvcmsgOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBzZWFyY2ggaW4gCi0gICAgICAgICAgICAgICAgLy8gcG9wIHVwIGxpc3QgYXMgY2hhcmFjdGVycyB0eXBlZCBpbiB0ZXh0IHdpZGdldAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuS2V5VXA6IHsKLSAgICAgICAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICAgICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICAgICAgICAgICAgZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLSAgICAgICAgICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULk1lbnVEZXRlY3Q6IHsKLSAgICAgICAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICAgICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuTWVudURldGVjdCwgZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Nb2RpZnk6IHsKLSAgICAgICAgICAgICAgICB0aGlzLmxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULk1vZGlmeSwgZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZURvd246IHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXh0LmdldEVkaXRhYmxlICgpKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkcm9wcGVkID0gaXNEcm9wcGVkICgpOwotICAgICAgICAgICAgICAgIHRoaXMudGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgICAgICAgICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgICAgICAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHQuZ2V0RWRpdGFibGUgKCkpIHJldHVybjsKLSAgICAgICAgICAgICAgICB0aGlzLnRleHQuc2VsZWN0QWxsICgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuVHJhdmVyc2U6IHsgICAgICAgIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vTk9UIFNVUkUKLSAgICAvLyAgICAgICAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRlciBjYXVzZXMgZGVmYXVsdCBzZWxlY3Rpb24gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXJyb3cga2V5cyBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBsaXN0IGNvbnRlbnRzIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgdXNlIHRoZW0gZm9yIHRyYXZlcnNhbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICAgICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICAgICAgZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7Ci0gICAgICAgICAgICAgICAgZS5kb2l0ID0gZXZlbnQuZG9pdDsKLSAgICAgICAgICAgICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgICAgICAgICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlRyYXZlcnNlLCBlKTsKLSAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IGUuZGV0YWlsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuVmVyaWZ5OiB7Ci0gICAgICAgICAgICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgICAgICAgICBlLnRleHQgPSBldmVudC50ZXh0OwotICAgICAgICAgICAgICAgIGUuc3RhcnQgPSBldmVudC5zdGFydDsKLSAgICAgICAgICAgICAgICBlLmVuZCA9IGV2ZW50LmVuZDsKLSAgICAgICAgICAgICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgICAgICAgICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlZlcmlmeSwgZSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvU3d0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL1N3dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlMzVhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL3V0aWwvU3d0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3d0VXRpbAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldFByZWZlcnJlZFdpZHRoKCBmaW5hbCBDb250cm9sIGNvbnRyb2wgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2wuY29tcHV0ZVNpemUoIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCApLng7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5PbkRpc3BsYXlUaHJlYWQoIGZpbmFsIERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSApCi0gICAgewotICAgICAgICBpZiggZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyggcnVubmFibGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL1RhYmxlV3JhcExheW91dFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZVdyYXBMYXlvdXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWY2MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC91dGlsL1RhYmxlV3JhcExheW91dFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZVdyYXBMYXlvdXRVdGlsCi17Ci0gICAgcHVibGljIHN0YXRpYyBUYWJsZVdyYXBMYXlvdXQgdHdsYXlvdXQoIGZpbmFsIGludCBjb2x1bW5zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0d2xheW91dCggY29sdW1ucywgMCwgMCwgMCwgMCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlV3JhcExheW91dCB0d2xheW91dCggZmluYWwgaW50IGNvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b3BNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBib3R0b21NYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHRNYXJnaW4gKQotICAgIHsKLSAgICAgICAgZmluYWwgVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOwotICAgICAgICBsYXlvdXQudG9wTWFyZ2luID0gdG9wTWFyZ2luOwotICAgICAgICBsYXlvdXQuYm90dG9tTWFyZ2luID0gYm90dG9tTWFyZ2luOwotICAgICAgICBsYXlvdXQubGVmdE1hcmdpbiA9IGxlZnRNYXJnaW47Ci0gICAgICAgIGxheW91dC5yaWdodE1hcmdpbiA9IHJpZ2h0TWFyZ2luOwotCi0gICAgICAgIHJldHVybiBsYXlvdXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVXcmFwRGF0YSB0d2QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVdyYXBEYXRhKCBUYWJsZVdyYXBEYXRhLkZJTExfR1JBQiwgVGFibGVXcmFwRGF0YS5NSURETEUgKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlV3JhcERhdGEgdHdkY29sc3BhbiggZmluYWwgVGFibGVXcmFwRGF0YSB0d2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2xzcGFuICkKLSAgICB7Ci0gICAgICAgIHR3ZC5jb2xzcGFuID0gY29sc3BhbjsKLSAgICAgICAgcmV0dXJuIHR3ZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVdyYXBEYXRhIHR3ZGluZGVudCggZmluYWwgVGFibGVXcmFwRGF0YSB0d2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGVudCApCi0gICAgewotICAgICAgICB0d2QuaW5kZW50ID0gaW5kZW50OwotICAgICAgICByZXR1cm4gdHdkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlV3JhcERhdGEgdHdkaGhpbnQoIGZpbmFsIFRhYmxlV3JhcERhdGEgdHdkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodEhpbnQgKQotICAgIHsKLSAgICAgICAgdHdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotICAgICAgICByZXR1cm4gdHdkOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTgyMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotamF2YUNvbXBpbGVyLnRlc3RzLmphci5hcmdzCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDgwZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNWYxYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIEZlYiAwMiAxNjo1MTozOSBQU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjdmMWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWU6IEZhY2V0IENvcmUgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMiw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQKLUJ1bmRsZS1DbGFzc1BhdGg6IHRlc3RzLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1MDJjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gdGVzdHMuamFyCi1zb3VyY2UudGVzdHMuamFyID0gc3JjLwotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODMzMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cwotQnVuZGxlLU5hbWUuMCA9IEZhY2V0IENvcmUgVGVzdHMgUGx1Zy1pbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmJhNWM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLQotPHBsdWdpbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gICAgCi0gICAgPGNhdGVnb3J5IGlkPSJjYXQxIj4KLSAgICAgIDxsYWJlbD5DYXRlZ29yeSAxPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnk+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQxIj4KLSAgICAgIDxsYWJlbD5GYWNldCAxPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmYWNldDEuPC9kZXNjcmlwdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MUluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIHR5cGU9InVuaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIHR5cGU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIiPgotICAgICAgPGFjdGlvbiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MUluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIHR5cGU9InVuaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIHR5cGU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMi4xLTIuMF0iIHR5cGU9Imluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MUluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMi4xLTIuMF0iIHR5cGU9InVuaW5zdGFsbCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjIuMS0yLjBdIiB0eXBlPSJ2ZXJzaW9uLWNoYW5nZSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0MiI+Ci0gICAgICA8dmVyc2lvbi1jb21wYXJhdG9yIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkN1c3RvbVZlcnNpb25Db21wYXJhdG9yIi8+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJjYXQxIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MiIgdmVyc2lvbj0iMy41Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyIiB2ZXJzaW9uPSIzLjUjYSI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMi0xLjMpIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MiIgdmVyc2lvbj0iNC43Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8b3I+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgPC9vcj4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDIiIHZlcnNpb249IjQuNyNiIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8b3I+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgICAgPC9vcj4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAgICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyIiB2ZXJzaW9uPSI0LjcjYyI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgICAgICA8L29yPgotICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2EiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJncm91cDEiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJncm91cDEiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQyZXh0Ij4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9ImNhdDEiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyZXh0IiB2ZXJzaW9uPSIxLjAiLz4KLQotICAgIDxjYXRlZ29yeSBpZD0iY2F0MiIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDNhIj4gPCEtLSBUZXN0cyBhIGZhY2V0IHdpdGggbm8gZGVzY3JpcHRpb24uIC0tPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0iY2F0MiIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNhIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNhIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAKLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDNhIiB2ZXJzaW9uPSJbMS4wLTIuMF0iIHR5cGU9Imluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0M2FJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0M2EiIHZlcnNpb249IlsxLjAtMi4wXSIgdHlwZT0idW5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDNhVW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDNhIiB2ZXJzaW9uPSJbMS4wLTIuMF0iIHR5cGU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDNhVmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQzYiI+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJjYXQyIi8+Ci0gICAgICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gPCEtLSBUZXN0cyBhIGZhY2V0IHdpdGggYW4gZW1wdHkgZGVzY3JpcHRpb24uIC0tPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNiIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQzYyI+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJjYXQyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2MiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJncm91cDEiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2MiIHZlcnNpb249IjIuMCI+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJncm91cDEiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDwhLS0gUHJlc2V0c1Rlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyI+Ci0gIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9wcmVzZXQxIj4KLSAgICAgIDxsYWJlbD5QcmVzZXQgMTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBmaXJzdCBwcmVzZXQuPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQyIiB2ZXJzaW9uPSIzLjUjYSIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDJleHQiIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9wcmVzZXQyIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNjIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X3ByZXNldDMiIGV4dGVuZHM9InB0X3ByZXNldDEiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNhIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPiAgPCEtLSBUZXN0cyB0aGF0IHRoZSB2ZXJzaW9uIGluIGRlcml2ZWQgcHJlc2V0IHdpbnMuIC0tPgotICAgIDwvc3RhdGljLXByZXNldD4gICAgICAKLQotICAgIDxkeW5hbWljLXByZXNldCBpZD0icHRfZHluX3ByZXNldCI+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuUHJlc2V0c1Rlc3RzJFByZXNldEZhY3RvcnkiLz4KLSAgICA8L2R5bmFtaWMtcHJlc2V0PiAgICAgIAotCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSIgZXh0ZW5kcz0icHRfZHluX3ByZXNldCI+Ci0gICAgICA8bGFiZWw+U3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldDwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQyIiB2ZXJzaW9uPSIzLjUjYSIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8yIiBleHRlbmRzPSJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiPgotICAgICAgPGxhYmVsPlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQgMjwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24gMi48L2Rlc2NyaXB0aW9uPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2EiIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDwhLS0gUmVmZXJlbmNlcyBmYWNldCB0aGF0IGRvZXNuJ3QgZXhpc3QuIC0tPgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9iYWQucHJlc2V0MSI+Ci0gICAgICA8ZmFjZXQgaWQ9ImFiYyIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPCEtLSBSZWZlcmVuY2VzIGZhY2V0IHZlcnNpb24gdGhhdCBkb2Vzbid0IGV4aXN0LiAtLT4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfYmFkLnByZXNldDIiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDIiIHZlcnNpb249Ijk5Ljk4Ii8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPCEtLSBSZWZlcmVuY2VzIGJhc2UgcHJlc2V0IHRoYXQgZG9lc24ndCBleGlzdC4gLS0+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2JhZC5wcmVzZXQzIiBleHRlbmRzPSJkb2VzLm5vdC5leGlzdCI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MiIgdmVyc2lvbj0iMy41I2EiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0gICAgCi0gICAgPCEtLSBUaGUgZm9sbG93aW5nIGZvdXIgcHJlc2V0cyBmb3JtIGEgY3ljbGUuIC0tPgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9jeWNsZV9wcmVzZXQxIiBleHRlbmRzPSJwdF9jeWNsZV9wcmVzZXQzIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfY3ljbGVfcHJlc2V0MiIgZXh0ZW5kcz0icHRfY3ljbGVfcHJlc2V0MSI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfY3ljbGVfcHJlc2V0MyIgZXh0ZW5kcz0icHRfY3ljbGVfcHJlc2V0MiI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfY3ljbGVfcHJlc2V0NCIgZXh0ZW5kcz0icHRfY3ljbGVfcHJlc2V0MyI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0gICAgCi0gIDwvZXh0ZW5zaW9uPiAgCi0KLSAgPCEtLSBGYWNldCBDb25zdHJhaW50IFRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mMSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mMSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJmY3RfZjIiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2YyIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2YyIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImZjdF9mNCIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2YzIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2YzIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2YyIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjQiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjQiIHZlcnNpb249IjEuMCI+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjUiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjUiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjIiIHZlcnNpb249IjEuMCIgc29mdD0idHJ1ZSIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mNiIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSIyLjMiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249IjMuNyIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iNC4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSI0LjUiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y3Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y3IiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2Y2Ii8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNyIgdmVyc2lvbj0iMi4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iWzUuMC02LjUpIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y4Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y4IiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZmN0X2cxIi8+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAgICAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjgiIHZlcnNpb249IjIuMCI+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJmY3RfZzEiLz4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mOCIgdmVyc2lvbj0iMy4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjkiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjkiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJmY3RfZzEiLz4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjEwIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjEwIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBncm91cD0iZmN0X2cxIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mMTAiIHZlcnNpb249IjIuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGdyb3VwPSJmY3RfZzEiIHNvZnQ9InRydWUiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxncm91cCBpZD0iZmN0X2cxIj4KLSAgICAgIDxsYWJlbD5GQ1QgR3JvdXAgMTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24uPC9kZXNjcmlwdGlvbj4KLSAgICA8L2dyb3VwPgotCi0gIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gRGVmYXVsdCBWZXJzaW9uIFRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mMSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjEiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMSIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2YyIj4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iMi4wIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YyIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjIiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMiIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2YzIj4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gcHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkRlZmF1bHRWZXJzaW9uVGVzdHMkRmFjZXREdnRGM0RlZmF1bHRWZXJzaW9uUHJvdmlkZXIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YzIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjMiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMyIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YzIiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjQiPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRGVmYXVsdFZlcnNpb25UZXN0cyRGYWNldER2dEYzRGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjQiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNCIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y0IiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjQiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mNSI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5EZWZhdWx0VmVyc2lvblRlc3RzJEZhY2V0RHZ0RjVEZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y1IiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjUiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNSIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2Y2Ij4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gcHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkRlZmF1bHRWZXJzaW9uVGVzdHMkRmFjZXREdnRGNkRlZmF1bHRWZXJzaW9uUHJvdmlkZXIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y2IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjYiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNiIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y2IiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjciPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSI1LjAiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y3IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjciIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNyIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y3IiB2ZXJzaW9uPSI0LjAiLz4KLQotICA8L2V4dGVuc2lvbj4KLQotICA8IS0tIEZhY2V0QWN0aW9uRXhlY3V0aW9uVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmF0X2YxIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmF0X2YxIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5GYWNldEFjdGlvbnNUZXN0cyRGMXYxSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYXRfZjEiIHZlcnNpb249IjIuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkZhY2V0QWN0aW9uc1Rlc3RzJEYxdjJJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDwhLS0gVUkgVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0idWlfbG9uZ19sYWJlbDEiPgotICAgICAgPGxhYmVsPlRoaXMgZmFjZXQgaGFzIGEgcmVhbGx5IHJlYWxseSByYXRoZXIgbG9uZyBsYWJlbDwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+QW5kIGEgc2hvcnQgZGVzY3JpcHRpb24uPC9kZXNjcmlwdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQ+IAotICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ1aV9sb25nX2xhYmVsMSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGNhdGVnb3J5IGlkPSJ1aV9sb25nX2xhYmVsX2NhdGVnb3J5Ij4KLSAgICAgIDxsYWJlbD5DYXRlZ29yeSBmb3IgZmFjZXRzIHdpdGggbG9uZyBsYWJlbHM8L2xhYmVsPgotICAgIDwvY2F0ZWdvcnk+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0idWlfbG9uZ19sYWJlbDIiPgotICAgICAgPGxhYmVsPlRoaXMgZmFjZXQgaGFzIGEgcmVhbGx5IHJlYWxseSByYXRoZXIgbG9uZyBsYWJlbDwvbGFiZWw+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJ1aV9sb25nX2xhYmVsX2NhdGVnb3J5Ii8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PiAKLSAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0idWlfbG9uZ19sYWJlbDIiIHZlcnNpb249IjEuMi4zLjQuNS42LjcuOC45Ij4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0idWlfbG9uZ19sYWJlbDIiIHZlcnNpb249IjkuOC43LjYuNS40LjMuMi4xIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDwhLS0gRXZlbnREZWxpdmVyeVRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImVkdF9mMSIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjEiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMSIgdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjEiIHR5cGU9IlZFUlNJT05fQ0hBTkdFIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJlZHRfZjIiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjIiIHZlcnNpb249IjEuMSIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMiIgdmVyc2lvbj0iMi4xIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YyIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjIiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YyIiB0eXBlPSJWRVJTSU9OX0NIQU5HRSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImVkdF9mMyIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMyIgdmVyc2lvbj0iMS4yIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YzIiB2ZXJzaW9uPSIyLjIiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjMiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMyIgdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjMiIHR5cGU9IlZFUlNJT05fQ0hBTkdFIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJlZHRfZjQiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjQiIHZlcnNpb249IjEuMyIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mNCIgdmVyc2lvbj0iMi4zIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2Y0IiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjQiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2Y0IiB0eXBlPSJWRVJTSU9OX0NIQU5HRSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlzdGVuZXJzIj4KLSAgICA8bGlzdGVuZXIgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRXZlbnREZWxpdmVyeVRlc3RzJEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyIi8+Ci0gICAgPGxpc3RlbmVyIAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkV2ZW50RGVsaXZlcnlUZXN0cyRQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lciIKLSAgICAgIGV2ZW50VHlwZXM9IlBSRV9JTlNUQUxMLEZJWEVEX0ZBQ0VUU19DSEFOR0VEIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gUHJvamVjdENyZWF0aW9uVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0icGN0LWYxIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0icGN0LWYxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJwY3QtZjEiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InBjdC1mMiIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InBjdC1mMiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0icGN0LWYyIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzYjAzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NjNTI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZhY2V0ZWQtcHJvamVjdD4KLSAgPGluc3RhbGxlZCBmYWNldD0iZWR0X2YxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgPGluc3RhbGxlZCBmYWNldD0iZWR0X2YyIiB2ZXJzaW9uPSIxLjEiLz4KLTwvZmFjZXRlZC1wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Fic3RyYWN0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BYnN0cmFjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTcwM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Fic3RyYWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVTVF9QUk9KRUNUX05BTUUgPSAidGVzdFByb2plY3QiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PElSZXNvdXJjZT4gcmVzb3VyY2VzVG9DbGVhbnVwID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PFJ1bm5hYmxlPiB0ZWFyRG93bk9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFJ1bm5hYmxlPigpOwotICAgIAotICAgIHByb3RlY3RlZCBBYnN0cmFjdFRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpCi0gICAgICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZvciggSVJlc291cmNlIHIgOiB0aGlzLnJlc291cmNlc1RvQ2xlYW51cCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHIuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggUnVubmFibGUgcnVubmFibGUgOiB0aGlzLnRlYXJEb3duT3BlcmF0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFJlc291cmNlVG9DbGVhbnVwKCBmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCByZXNvdXJjZSApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRUZWFyRG93bk9wZXJhdGlvbiggZmluYWwgUnVubmFibGUgcnVubmFibGUgKQotICAgIHsKLSAgICAgICAgdGhpcy50ZWFyRG93bk9wZXJhdGlvbnMuYWRkKCBydW5uYWJsZSApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRmFjZXRlZFByb2plY3QoIERFRkFVTFRfVEVTVF9QUk9KRUNUX05BTUUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdCBjcmVhdGVGYWNldGVkUHJvamVjdCggZmluYWwgU3RyaW5nIG5hbWUgKQotCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBuYW1lICkuZXhpc3RzKCkgKTsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggbmFtZSwgbnVsbCwgbnVsbCApOwotICAgICAgICBmaW5hbCBJUHJvamVjdCBwaiA9IGZwai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIHBqLmV4aXN0cygpICk7Ci0gICAgICAgIGFkZFJlc291cmNlVG9DbGVhbnVwKCBwaiApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZwajsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTExNWI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkFsbCBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIFRlc3RzIiApOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQmFzaWNUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIFByZXNldHNUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIFByb2plY3RDcmVhdGlvblRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQmFzaWNGYWNldEFjdGlvblRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggRmFjZXRBY3Rpb25Tb3J0VGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBGYWNldEFjdGlvbnNUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggRmFjZXRDb25zdHJhaW50c1Rlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggRGVmYXVsdFZlcnNpb25UZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEV2ZW50RGVsaXZlcnlUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNGYWNldEFjdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNGYWNldEFjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2U2NDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljRmFjZXRBY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEJhc2ljRmFjZXRBY3Rpb25UZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1RfTkFNRSA9ICJ0ZXN0UHJvamVjdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsZSBmYWNldDFBcnRpZmFjdEZpbGUKLSAgICAgICAgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggVEVTVF9QUk9KRUNUX05BTUUgKS5nZXRGaWxlKCAiZmFjZXQxLnR4dCIgKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMDsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQxIiApOwotICAgICAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjF2MTIgPSBmMS5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICAgICAgZjF2MTIxID0gZjEuZ2V0VmVyc2lvbiggIjEuMi4xIiApOwotICAgICAgICAgICAgZjF2MTMgPSBmMS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICAgICAgZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcy4gVGhpcyBhcGkgaXMgdGVzdGVkIGV4cGxpY2l0bHkuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgZnBqOwotICAgIAotICAgIHByaXZhdGUgQmFzaWNGYWNldEFjdGlvblRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkJhc2ljIEZhY2V0IEFjdGlvbiBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0SW5zdGFsbDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldEluc3RhbGwyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRJbnN0YWxsMyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0VW5pbnN0YWxsMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0VW5pbnN0YWxsMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0VW5pbnN0YWxsMyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0VmVyc2lvbkNoYW5nZTEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldFZlcnNpb25DaGFuZ2UyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0QWN0aW9uU2VyaWVzIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoIFRFU1RfUFJPSkVDVF9OQU1FICkuZXhpc3RzKCkgKTsKLSAgICAgICAgdGhpcy5mcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIFRFU1RfUFJPSkVDVF9OQU1FLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwai5nZXRQcm9qZWN0KCkuZXhpc3RzKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmdldFByb2plY3QoKS5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0SW5zdGFsbDEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMCwgbnVsbCwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEyMSwgbnVsbCwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyMS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0SW5zdGFsbDMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MjAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MjAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldFVuaW5zdGFsbDEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMCwgbnVsbCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai51bmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmYWNldDFBcnRpZmFjdEZpbGUuZXhpc3RzKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRVbmluc3RhbGwyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTIxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLnVuaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTIxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmYWNldDFBcnRpZmFjdEZpbGUuZXhpc3RzKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRVbmluc3RhbGwzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MjAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoudW5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYyMCwgbnVsbCwgbnVsbCApOwotICAgICAgICBhc3NlcnRGYWxzZSggZmFjZXQxQXJ0aWZhY3RGaWxlLmV4aXN0cygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldFZlcnNpb25DaGFuZ2UxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMjEsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIxLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldFZlcnNpb25DaGFuZ2UyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTMsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMiwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvblNlcmllcygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbjsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyLmdldFZlcnNpb25TdHJpbmcoKSApOwotCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMjEsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIxLmdldFZlcnNpb25TdHJpbmcoKSApOwotCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMywgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMy5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYyMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYyMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZjF2MjAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmYWNldDFBcnRpZmFjdEZpbGUuZXhpc3RzKCkgKTsKLQotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMiwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMywgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMy5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYyMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYyMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMjEsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIxLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmMXYxMjEsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmYWNldDFBcnRpZmFjdEZpbGUuZXhpc3RzKCkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3NzY5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQmFzaWNUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgCi0gICAgICAgID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIxOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTM7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjI7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNTsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1YTsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3OwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdiOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdjOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmMmV4dDsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYyZXh0djEwOwotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYTsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYXYxMDsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYXYyMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmM2I7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2J2MTA7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2J2MjA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNjOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNjdjEwOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNjdjIwOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDEiICk7Ci0gICAgICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmMXYxMiA9IGYxLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgICAgICBmMXYxMjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4yLjEiICk7Ci0gICAgICAgICAgICBmMXYxMyA9IGYxLmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgICAgICBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQyIiApOwotICAgICAgICAgICAgZjJ2MzUgPSBmMi5nZXRWZXJzaW9uKCAiMy41IiApOwotICAgICAgICAgICAgZjJ2MzVhID0gZjIuZ2V0VmVyc2lvbiggIjMuNSNhIiApOwotICAgICAgICAgICAgZjJ2NDcgPSBmMi5nZXRWZXJzaW9uKCAiNC43IiApOwotICAgICAgICAgICAgZjJ2NDdiID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNiIiApOwotICAgICAgICAgICAgZjJ2NDdjID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNjIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmMmV4dCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MmV4dCIgKTsKLSAgICAgICAgICAgIGYyZXh0djEwID0gZjJleHQuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICAgICAgZjNhID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYSIgKTsKLSAgICAgICAgICAgIGYzYXYxMCA9IGYzYS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNhdjIwID0gZjNhLmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2IiICk7Ci0gICAgICAgICAgICBmM2J2MTAgPSBmM2IuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzYnYyMCA9IGYzYi5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgICAgICBmM2MgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNjIiApOwotICAgICAgICAgICAgZjNjdjEwID0gZjNjLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2N2MjAgPSBmM2MuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgZmFpbHVyZXMuIFRoaXMgYXBpIGlzIHRlc3RlZCBleHBsaWNpdGx5LgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQmFzaWNUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJCYXNpYyBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RQcm9qZWN0RmFjZXRFeHRlbnNpb25Qb2ludCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RQcm9qZWN0RmFjZXRWZXJzaW9uRXh0ZW5zaW9uUG9pbnQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0Q2F0ZWdvcnlFeHRlbnNpb25Qb2ludCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3REZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0Q3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0VmVyc2lvbkV4cHJlc3Npb25zIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdFZlcnNpb25FeHByZXNzaW9uc1dpdGhVbmtub3duVmVyc2lvbnMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0Q29uc3RyYWludHMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0Q29uc3RyYWludEFwaSIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdEZhY2V0RXh0ZW5zaW9uUG9pbnQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCAiZmFjZXQxIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDEiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldHMoKS5jb250YWlucyggZjEgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRJZCgpLCAiZmFjZXQxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldExhYmVsKCksICJGYWNldCAxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmYWNldDEuIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCAiZmFjZXQyIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldHMoKS5jb250YWlucyggZjIgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRJZCgpLCAiZmFjZXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldExhYmVsKCksICJmYWNldDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0RGVzY3JpcHRpb24oKSwgIiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RGYWNldFZlcnNpb25FeHRlbnNpb25Qb2ludCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmMS5oYXNWZXJzaW9uKCAiMS4wIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMC5nZXRWZXJzaW9uU3RyaW5nKCksICIxLjAiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTAuZ2V0UHJvamVjdEZhY2V0KCksIGYxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTAuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEuaGFzVmVyc2lvbiggIjEuMiIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMiA9IGYxLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIuZ2V0VmVyc2lvblN0cmluZygpLCAiMS4yIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyLmdldFByb2plY3RGYWNldCgpLCBmMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYxLmhhc1ZlcnNpb24oICIxLjIuMSIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4yLjEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIxLmdldFZlcnNpb25TdHJpbmcoKSwgIjEuMi4xIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyMS5nZXRQcm9qZWN0RmFjZXQoKSwgZjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMjEuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEuaGFzVmVyc2lvbiggIjEuMyIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMyA9IGYxLmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTMuZ2V0VmVyc2lvblN0cmluZygpLCAiMS4zIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEzLmdldFByb2plY3RGYWNldCgpLCBmMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEzLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYxLmhhc1ZlcnNpb24oICIyLjAiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjIwLmdldFZlcnNpb25TdHJpbmcoKSwgIjIuMCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYyMC5nZXRQcm9qZWN0RmFjZXQoKSwgZjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYyMC5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTAsIGYxdjEyLCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjIuaGFzVmVyc2lvbiggIjMuNSIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNSA9IGYyLmdldFZlcnNpb24oICIzLjUiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzUuZ2V0VmVyc2lvblN0cmluZygpLCAiMy41IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1LmdldFByb2plY3RGYWNldCgpLCBmMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1LmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYyLmhhc1ZlcnNpb24oICIzLjUjYSIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNWEgPSBmMi5nZXRWZXJzaW9uKCAiMy41I2EiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzVhLmdldFZlcnNpb25TdHJpbmcoKSwgIjMuNSNhIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1YS5nZXRQcm9qZWN0RmFjZXQoKSwgZjIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNWEuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMi5oYXNWZXJzaW9uKCAiNC43IiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3ID0gZjIuZ2V0VmVyc2lvbiggIjQuNyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0Ny5nZXRWZXJzaW9uU3RyaW5nKCksICI0LjciICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDcuZ2V0UHJvamVjdEZhY2V0KCksIGYyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDcuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjIuaGFzVmVyc2lvbiggIjQuNyNiIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YiA9IGYyLmdldFZlcnNpb24oICI0LjcjYiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2IuZ2V0VmVyc2lvblN0cmluZygpLCAiNC43I2IiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdiLmdldFByb2plY3RGYWNldCgpLCBmMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yi5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMi5oYXNWZXJzaW9uKCAiNC43I2MiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdjID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNjIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yy5nZXRWZXJzaW9uU3RyaW5nKCksICI0LjcjYyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2MuZ2V0UHJvamVjdEZhY2V0KCksIGYyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdjLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRWZXJzaW9ucygpLCAKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjJ2MzUsIGYydjM1YSwgZjJ2NDcsIGYydjQ3YiwgZjJ2NDdjICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGZvciB2ZXJzaW9uIHRoYXQgZG9lc24ndCBleGlzdC4KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMi5oYXNWZXJzaW9uKCAiNi45IiApICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZjIuZ2V0VmVyc2lvbiggIjYuOSIgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKSB7fQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlFeHRlbnNpb25Qb2ludCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc0NhdGVnb3J5RGVmaW5lZCggImNhdDEiICkgKTsKLSAgICAgICAgZmluYWwgSUNhdGVnb3J5IGNhdDEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yeSggImNhdDEiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldENhdGVnb3JpZXMoKS5jb250YWlucyggY2F0MSApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDEuZ2V0SWQoKSwgImNhdDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0MS5nZXRMYWJlbCgpLCAiQ2F0ZWdvcnkgMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQxLmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0MS5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDEuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjIsIGYyZXh0ICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRDYXRlZ29yeSgpLCBjYXQxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJleHQuZ2V0Q2F0ZWdvcnkoKSwgY2F0MSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNDYXRlZ29yeURlZmluZWQoICJjYXQyIiApICk7Ci0gICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXQyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcnkoICJjYXQyIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yaWVzKCkuY29udGFpbnMoIGNhdDIgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQyLmdldElkKCksICJjYXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDIuZ2V0TGFiZWwoKSwgImNhdDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0Mi5nZXREZXNjcmlwdGlvbigpLCAiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDIuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDIuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjNhLCBmM2IsIGYzYyApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjNhLmdldENhdGVnb3J5KCksIGNhdDIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmM2IuZ2V0Q2F0ZWdvcnkoKSwgY2F0MiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYzYy5nZXRDYXRlZ29yeSgpLCBjYXQyICk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWZXJzaW9uQ29tcGFyYXRvcigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXAgPSBmMS5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjb21wLmdldENsYXNzKCkuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4wIiwgIjEuMiIgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yIiwgIjEuMi4xIiApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIuMSIsICIyLjAiICkgPCAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIiLCAiMS4wIiApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIuMSIsICIxLjIiICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjIuMCIsICIxLjIuMSIgKSA+IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMCIsICIxLjAiICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIiLCAiMS4yIiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yLjEiLCAiMS4yLjEiICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIyLjAiLCAiMi4wIiApID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYxdjEwLmNvbXBhcmVUbyggZjF2MTIgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIuY29tcGFyZVRvKCBmMXYxMjEgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIxLmNvbXBhcmVUbyggZjF2MjAgKSA8IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyLmNvbXBhcmVUbyggZjF2MTAgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIxLmNvbXBhcmVUbyggZjF2MTIgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MjAuY29tcGFyZVRvKCBmMXYxMjEgKSA+IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYxdjEwLmNvbXBhcmVUbyggZjF2MTAgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyLmNvbXBhcmVUbyggZjF2MTIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyMS5jb21wYXJlVG8oIGYxdjEyMSApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MjAuY29tcGFyZVRvKCBmMXYyMCApID09IDAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldExhdGVzdFZlcnNpb24oKSwgZjF2MjAgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgYXNjID0gZjEuZ2V0U29ydGVkVmVyc2lvbnMoIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLnNpemUoKSwgNSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDAgKSwgZjF2MTAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAxICksIGYxdjEyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMiApLCBmMXYxMjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAzICksIGYxdjEzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggNCApLCBmMXYyMCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdCBkZXNjID0gZjEuZ2V0U29ydGVkVmVyc2lvbnMoIGZhbHNlICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2Muc2l6ZSgpLCA1ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDAgKSwgZjF2MjAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMSApLCBmMXYxMyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAyICksIGYxdjEyMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAzICksIGYxdjEyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDQgKSwgZjF2MTAgKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WZXJzaW9uQ29tcGFyYXRvcigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXAgPSBmMi5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjb21wLmdldENsYXNzKCkuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5DdXN0b21WZXJzaW9uQ29tcGFyYXRvciIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjMuNSIsICI0LjciICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjMuNSIsICIzLjUjYSIgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiNC43I2MiLCAiNC43I2IiICkgPCAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICI0LjciLCAiMy41IiApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIzLjUjYSIsICIzLjUiICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjQuNyNiIiwgIjQuNyNjIiApID4gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMy41IiwgIjMuNSIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjMuNSNhIiwgIjMuNSNhIiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiNC43IiwgIjQuNyIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjQuNyNiIiwgIjQuNyNiIiApID09IDAgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNS5jb21wYXJlVG8oIGYydjQ3ICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1LmNvbXBhcmVUbyggZjJ2MzVhICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yy5jb21wYXJlVG8oIGYydjQ3YiApIDwgMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDcuY29tcGFyZVRvKCBmMnYzNSApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNWEuY29tcGFyZVRvKCBmMnYzNSApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2IuY29tcGFyZVRvKCBmMnY0N2MgKSA+IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYydjM1LmNvbXBhcmVUbyggZjJ2MzUgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1YS5jb21wYXJlVG8oIGYydjM1YSApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDcuY29tcGFyZVRvKCBmMnY0NyApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdiLmNvbXBhcmVUbyggZjJ2NDdiICkgPT0gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRMYXRlc3RWZXJzaW9uKCksIGYydjQ3YiApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdCBhc2MgPSBmMi5nZXRTb3J0ZWRWZXJzaW9ucyggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2Muc2l6ZSgpLCA1ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMCApLCBmMnYzNSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDEgKSwgZjJ2MzVhICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMiApLCBmMnY0NyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDMgKSwgZjJ2NDdjICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggNCApLCBmMnY0N2IgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgZGVzYyA9IGYyLmdldFNvcnRlZFZlcnNpb25zKCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLnNpemUoKSwgNSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAwICksIGYydjQ3YiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAxICksIGYydjQ3YyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAyICksIGYydjQ3ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDMgKSwgZjJ2MzVhICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDQgKSwgZjJ2MzUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25FeHByZXNzaW9ucygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuMiIgKSwgCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjIsMS4zIiApLCAKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIsIGYxdjEzICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjAsMS4yLDEuMi4xLDEuMywyLjAiICksIAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMCwgZjF2MTIsIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMS4yIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMiwgZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIigxLjIiICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjNdIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMCwgZjF2MTIsIGYxdjEyMSwgZjF2MTMgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuMykiICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEwLCBmMXYxMiwgZjF2MTIxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMS4yLTEuM10iICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyLCBmMXYxMjEsIGYxdjEzICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMS4yLTEuMykiICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyLCBmMXYxMjEgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIigxLjItMS4zXSIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIxLCBmMXYxMyApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4wLCgxLjItMS4zXSwyLjAiICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEwLCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjYXNlcyB3aGVyZSB2ZXJzaW9uIGV4cHJlc3Npb25zIG1ha2UgcmVmZXJlbmNlcyB0byBmYWNldCB2ZXJzaW9ucyB0aGF0IGRvbid0Ci0gICAgICogYWN0dWFsbHkgZXhpc3QuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25FeHByZXNzaW9uc1dpdGhVbmtub3duVmVyc2lvbnMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMC41LTEuMl0iICksIGFzU2V0KCBmMXYxMCwgZjF2MTIgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzEuMi4yLTIuMF0iICksIGFzU2V0KCBmMXYxMywgZjF2MjAgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzAuNS0xMC4wKSIgKSwgYXNTZXQoIGYxdjEwLCBmMXYxMiwgZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzEwLjAtMjVdIiApLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIzLjAsNC41IiApLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICI1LjciICksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyYWludHMoKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyc2lvbjogMy41Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICAgICAqLyAKLQotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIxICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFZlcnNpb246IDMuNSNhCi0gICAgICAgICAqIAotICAgICAgICAgKiA8YW5kPgotICAgICAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4yLTEuMykiLz4KLSAgICAgICAgICogPC9hbmQ+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCAgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMiApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMjEgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBWZXJzaW9uOiA0LjcKLSAgICAgICAgICogCi0gICAgICAgICAqIDxvcj4KLSAgICAgICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgKiA8L29yPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCAgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyMSApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAgKSApLmlzT0soKSApOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyc2lvbjogNC43I2IKLSAgICAgICAgICogCi0gICAgICAgICAqIDxvcj4KLSAgICAgICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgICAgKiA8L29yPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMjEgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAgKSApLmlzT0soKSApOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyc2lvbjogNC43I2MKLSAgICAgICAgICogCi0gICAgICAgICAqIDxhbmQ+Ci0gICAgICAgICAqICAgPG9yPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICAgICAqICAgPC9vcj4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNhIi8+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBncm91cD0iZ3JvdXAxIi8+Ci0gICAgICAgICAqIDwvYW5kPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyMSApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2F2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2F2MjAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2J2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzYnYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzY3YxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzY3YyMCApICkuaXNPSygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW50QXBpKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggSUNvbnN0cmFpbnQuVHlwZS5BTkQubmFtZSgpLCAiYW5kIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJhbmQiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5BTkQgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAiYU5kIiApID09IElDb25zdHJhaW50LlR5cGUuQU5EICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIElDb25zdHJhaW50LlR5cGUuT1IubmFtZSgpLCAib3IiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggIm9yIiApID09IElDb25zdHJhaW50LlR5cGUuT1IgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAib1IiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5PUiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTLm5hbWUoKSwgInJlcXVpcmVzIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJyZXF1aXJlcyIgKSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggInJFcVVpUmVzIiApID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMubmFtZSgpLCAiY29uZmxpY3RzIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJjb25mbGljdHMiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAiY09uRmxJY1RzIiApID09IElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTICk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiA8YW5kPgotICAgICAgICAgKiAgIDxvcj4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgICAgKiAgIDwvb3I+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYSIvPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZ3JvdXA9Imdyb3VwMSIvPgotICAgICAgICAgKiA8L2FuZD4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc0dyb3VwRGVmaW5lZCggImdyb3VwMSIgKSApOwotICAgICAgICBmaW5hbCBJR3JvdXAgZyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldEdyb3VwKCAiZ3JvdXAxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGcuZ2V0SWQoKSwgImdyb3VwMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBnLmdldE1lbWJlcnMoKSwgYXNTZXQoIGYydjQ3YywgZjNjdjEwLCBmM2N2MjAgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgcm9vdCA9IGYydjQ3Yy5nZXRDb25zdHJhaW50KCk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggcm9vdCwgSUNvbnN0cmFpbnQuVHlwZS5BTkQsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIElDb25zdHJhaW50IGMxLCBjMjsKLSAgICAgICAgCi0gICAgICAgIGMxID0gKElDb25zdHJhaW50KSByb290LmdldE9wZXJhbmQoIDAgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMSwgSUNvbnN0cmFpbnQuVHlwZS5PUiwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYzIgPSAoSUNvbnN0cmFpbnQpIGMxLmdldE9wZXJhbmQoIDAgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMiwgSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUywgZjEsICIxLjIuMSIsIEJvb2xlYW4uRkFMU0UgKTsKLSAgICAgICAgCi0gICAgICAgIGMyID0gKElDb25zdHJhaW50KSBjMS5nZXRPcGVyYW5kKCAxICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzIsIElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMsIGYxLCAiMS4zIiwgQm9vbGVhbi5GQUxTRSApOwotICAgICAgICAKLSAgICAgICAgYzIgPSAoSUNvbnN0cmFpbnQpIGMxLmdldE9wZXJhbmQoIDIgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMiwgSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUywgZjEsICIyLjAiLCBCb29sZWFuLkZBTFNFICk7Ci0gICAgICAgIAotICAgICAgICBjMSA9IChJQ29uc3RyYWludCkgcm9vdC5nZXRPcGVyYW5kKCAxICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzEsIElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTLCBmM2EsICIqIiApOwotICAgICAgICAKLSAgICAgICAgYzEgPSAoSUNvbnN0cmFpbnQpIHJvb3QuZ2V0T3BlcmFuZCggMiApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMxLCBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUywgZjNiLCAiMS4wIiApOwotICAgICAgICAKLSAgICAgICAgYzEgPSAoSUNvbnN0cmFpbnQpIHJvb3QuZ2V0T3BlcmFuZCggMyApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMxLCBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUywgZyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBleHBlY3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQgKQotICAgIHsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjLCBleHBlY3RlZFR5cGUsIG5ldyBPYmplY3RbXSB7IGV4cGVjdGVkT3BlcmFuZCB9ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgZXhwZWN0ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDIgKQotICAgIHsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjLCBleHBlY3RlZFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGV4cGVjdGVkT3BlcmFuZDEsIGV4cGVjdGVkT3BlcmFuZDIgfSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25zdHJhaW50KCBmaW5hbCBJQ29uc3RyYWludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMyApCi0gICAgewotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMsIGV4cGVjdGVkVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZXhwZWN0ZWRPcGVyYW5kMSwgZXhwZWN0ZWRPcGVyYW5kMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE9wZXJhbmQzIH0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBleHBlY3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQ0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYywgZXhwZWN0ZWRUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBleHBlY3RlZE9wZXJhbmQxLCBleHBlY3RlZE9wZXJhbmQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkT3BlcmFuZDMsIGV4cGVjdGVkT3BlcmFuZDQgfSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBleHBlY3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGV4cGVjdGVkT3BlcmFuZHMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjLmdldFR5cGUoKSwgZXhwZWN0ZWRUeXBlICk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYy5nZXRPcGVyYW5kcygpLnNpemUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjb3VudCwgZXhwZWN0ZWRPcGVyYW5kcy5sZW5ndGggKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb3BlcmFuZCA9IGMuZ2V0T3BlcmFuZCggaSApOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkID0gZXhwZWN0ZWRPcGVyYW5kc1sgaSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZXhwZWN0ZWQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZXhwZWN0ZWQgaW5zdGFuY2VvZiBTdHJpbmcgKSAmJgotICAgICAgICAgICAgICAgICAgICAhICggb3BlcmFuZCBpbnN0YW5jZW9mIFN0cmluZyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyggb3BlcmFuZC50b1N0cmluZygpLCBleHBlY3RlZCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIG9wZXJhbmQsIGV4cGVjdGVkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsaXN0LmFkZCggYy5nZXRPcGVyYW5kKCBpICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjLmdldE9wZXJhbmRzKCksIGxpc3QgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRGVmYXVsdFZlcnNpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0RlZmF1bHRWZXJzaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZjlhMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRGVmYXVsdFZlcnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVmYXVsdFZlcnNpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmVyc2lvblRlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXY0OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzdjM7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNHY0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNXY0OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2NDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjd2NDsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2YxIiApOwotICAgICAgICBmMXY0ID0gZjEuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLQotICAgICAgICBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mMiIgKTsKLSAgICAgICAgZjJ2MiA9IGYyLmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgZjMgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjMiICk7Ci0gICAgICAgIGYzdjMgPSBmMy5nZXRWZXJzaW9uKCAiMy4wIiApOwotCi0gICAgICAgIGY0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2Y0IiApOwotICAgICAgICBmNHY0ID0gZjQuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLQotICAgICAgICBmNSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mNSIgKTsKLSAgICAgICAgZjV2NCA9IGY1LmdldFZlcnNpb24oICI0LjAiICk7Ci0KLSAgICAgICAgZjYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjYiICk7Ci0gICAgICAgIGY2djQgPSBmNi5nZXRWZXJzaW9uKCAiNC4wIiApOwotCi0gICAgICAgIGY3ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2Y3IiApOwotICAgICAgICBmN3Y0ID0gZjcuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBEZWZhdWx0VmVyc2lvblRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkRlZmF1bHQgVmVyc2lvbiBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RVbnNwZWNpZmllZERlZmF1bHRWZXJzaW9uIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdFN0YXRpY0RlZmF1bHRWZXJzaW9uIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdERlZmF1bHRWZXJzaW9uUHJvdmlkZXIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0QmFkRGVmYXVsdFZlcnNpb24iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFVuc3BlY2lmaWVkRGVmYXVsdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXREZWZhdWx0VmVyc2lvbigpLCBmMXY0ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNEZWZhdWx0VmVyc2lvbigpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldERlZmF1bHRWZXJzaW9uKCksIGYydjIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWZXJzaW9uUHJvdmlkZXIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMy5nZXREZWZhdWx0VmVyc2lvbigpLCBmM3YzICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBoYW5kbGluZyBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgYXNzb2NpYXRlZCBkZWZhdWx0IHZlcnNpb24KLSAgICAgKiBwcm92aWRlciByZXR1cm5zIGEgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBmYWNldCB0aGF0IHRoZQotICAgICAqIHZlcnNpb24gcHJvdmlkZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIxKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjQuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjR2NCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIGFzc29jaWF0ZWQgZGVmYXVsdCB2ZXJzaW9uCi0gICAgICogcHJvdmlkZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGludm9rZWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmNS5nZXREZWZhdWx0VmVyc2lvbigpLCBmNXY0ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBoYW5kbGluZyBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgYXNzb2NpYXRlZCBkZWZhdWx0IHZlcnNpb24KLSAgICAgKiBwcm92aWRlciByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjYuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjZ2NCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBoYW5kbGluZyBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgc3BlY2lmaWVkIHN0YXRpYyBkZWZhdWx0IHZlcnNpb24KLSAgICAgKiBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGZhY2V0LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZERlZmF1bHRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjcuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjd2NCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY2V0RHZ0RjNEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJRGVmYXVsdFZlcnNpb25Qcm92aWRlcgotICAgICAgICAKLSAgICB7Ci0gICAgCi0gICAgICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjMiICkuZ2V0VmVyc2lvbiggIjMuMCIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY2V0RHZ0RjVEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJRGVmYXVsdFZlcnNpb25Qcm92aWRlcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWNldER2dEY2RGVmYXVsdFZlcnNpb25Qcm92aWRlcgotCi0gICAgICAgIGltcGxlbWVudHMgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MzYxYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5GaWxlVXRpbC5GSUxFX0RPVF9QUk9KRUNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkZpbGVVdGlsLmNvcHlGcm9tUGx1Z2luOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5GYWNldGVkUHJvamVjdEZyYW1ld29ya0NvcmVUZXN0c1BsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1AU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQotcHVibGljIGZpbmFsIGNsYXNzIEV2ZW50RGVsaXZlcnlUZXN0cwotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRlc3RzCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MjE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzdjEyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzdjIyOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjR2MTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjR2MjM7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImVkdF9mMSIgKTsKLSAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIAotICAgICAgICBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImVkdF9mMiIgKTsKLSAgICAgICAgZjJ2MTEgPSBmMi5nZXRWZXJzaW9uKCAiMS4xIiApOwotICAgICAgICBmMnYyMSA9IGYyLmdldFZlcnNpb24oICIyLjEiICk7Ci0KLSAgICAgICAgZjMgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJlZHRfZjMiICk7Ci0gICAgICAgIGYzdjEyID0gZjMuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgZjN2MjIgPSBmMy5nZXRWZXJzaW9uKCAiMi4yIiApOwotCi0gICAgICAgIGY0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZWR0X2Y0IiApOwotICAgICAgICBmNHYxMyA9IGY0LmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgIGY0djIzID0gZjQuZ2V0VmVyc2lvbiggIjIuMyIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBFdmVudERlbGl2ZXJ5VGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiRXZlbnQgRGVsaXZlcnkgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEV2ZW50RGVsaXZlcnlUZXN0cyggInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEV2ZW50RGVsaXZlcnlUZXN0cyggInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEV2ZW50RGVsaXZlcnlUZXN0cyggInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEV2ZW50RGVsaXZlcnlUZXN0cyggInRlc3RFdmVudERlbGl2ZXJ5IiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IG5vIGZhY2V0ZWQgcHJvamVjdCBldmVudHMgYXJlIGRlbGl2ZXJlZCB3aGVuIGEgbmV3IGZhY2V0ZWQgcHJvamVjdAotICAgICAqIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRmFjZXRlZFByb2plY3QoICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24xIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXRyaWV2ZUV2ZW50cygpLnNpemUoKSwgMCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBubyBmYWNldGVkIHByb2plY3QgZXZlbnRzIGFyZSBkZWxpdmVyZWQgd2hlbiBhbiBleGlzdGluZyBmYWNldGVkIAotICAgICAqIHByb2plY3QgaXMgaW1wb3J0ZWQgaW50byB0aGUgd29ya3NwYWNlIGFuZCB0aGUgZmFjZXRlZCBwcm9qZWN0IHdyYXBwZXIgaXMgY3JlYXRlZC4gSW4gdGhpcwotICAgICAqIHNjZW5hcmlvIHZhcmlhbnQsIHRoZSBpbXBvcnRlZCBwcm9qZWN0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgYW5kIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZQotICAgICAqIHdvcmtzcGFjZSBpbiB0aGUgc2FtZSB3b3JrYmVuY2ggc2Vzc2lvbi4gCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24yKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24yIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSBmcGouZ2V0UHJvamVjdCgpOwotICAgICAgICBhZGRSZXNvdXJjZVRvQ2xlYW51cCggcGogKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMCwgbnVsbCwgbnVsbCApOwotICAgICAgICBmcGouaW5zdGFsbFByb2plY3RGYWNldCggZjJ2MTEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHBqLmRlbGV0ZSggZmFsc2UsIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXNldCgpOwotICAgICAgICAKLSAgICAgICAgcGouY3JlYXRlKCBudWxsICk7Ci0gICAgICAgIHBqLm9wZW4oIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqTmV3ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwaiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqTmV3Lmhhc1Byb2plY3RGYWNldCggZjF2MTAgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcGpOZXcuaGFzUHJvamVjdEZhY2V0KCBmMnYxMSApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmV0cmlldmVFdmVudHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqICE9IGZwak5ldyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBubyBmYWNldGVkIHByb2plY3QgZXZlbnRzIGFyZSBkZWxpdmVyZWQgd2hlbiBhbiBleGlzdGluZyBmYWNldGVkIAotICAgICAqIHByb2plY3QgaXMgaW1wb3J0ZWQgaW50byB0aGUgd29ya3NwYWNlIGFuZCB0aGUgZmFjZXRlZCBwcm9qZWN0IHdyYXBwZXIgaXMgY3JlYXRlZC4gSW4gdGhpcwotICAgICAqIHNjZW5hcmlvIHZhcmlhbnQsIG5vIHByb2plY3Qgd2l0aCB0aGFuIG5hbWUgaGFzIGV4aXN0ZWQgaW4gdGhlIHdvcmtzcGFjZSBpbiB0aGlzIHdvcmtiZW5jaAotICAgICAqIHNlc3Npb24uIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJlc2V0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBmaW5hbCBGaWxlIHdzTG9jYXRpb24gPSB3c1Jvb3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBwak5hbWUgPSAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMyI7Ci0gICAgICAgIGZpbmFsIEZpbGUgcGpMb2NhdGlvbiA9IG5ldyBGaWxlKCB3c0xvY2F0aW9uLCBwak5hbWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXNQcmVmaXggPSAicmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLyI7Ci0gICAgICAgIAotICAgICAgICBjb3B5RnJvbVBsdWdpbiggUExVR0lOX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKCByZXNQcmVmaXggKyBGSUxFX0RPVF9QUk9KRUNUICksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSggcGpMb2NhdGlvbiwgRklMRV9ET1RfUFJPSkVDVCApICk7Ci0gICAgICAgIAotICAgICAgICBjb3B5RnJvbVBsdWdpbiggUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgoIHJlc1ByZWZpeCArIEZhY2V0ZWRQcm9qZWN0Lk1FVEFEQVRBX0ZJTEUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCBwakxvY2F0aW9uLCBGYWNldGVkUHJvamVjdC5NRVRBREFUQV9GSUxFICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gd3NSb290LmdldFByb2plY3QoIHBqTmFtZSApOwotICAgICAgICAKLSAgICAgICAgcGouY3JlYXRlKCBudWxsICk7Ci0gICAgICAgIHBqLm9wZW4oIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFJlc291cmNlVG9DbGVhbnVwKCBwaiApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcGogKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGZwai5oYXNQcm9qZWN0RmFjZXQoIGYxdjEwICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqLmhhc1Byb2plY3RGYWNldCggZjJ2MTEgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJldHJpZXZlRXZlbnRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudERlbGl2ZXJ5KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gY3JlYXRlRmFjZXRlZFByb2plY3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNldHVwIGxpc3RlbmVycy4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3RlbmVyIGZ1bGxMaXN0ZW5lclByb2plY3RBcGkgPSBuZXcgTGlzdGVuZXIoKTsKLSAgICAgICAgZnBqLmFkZExpc3RlbmVyKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdGVuZXIgZnVsbExpc3RlbmVyR2xvYmFsQXBpID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0ZW5lciBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBmcGouYWRkTGlzdGVuZXIoIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX0lOU1RBTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuRklYRURfRkFDRVRTX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3RlbmVyIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSA9IG5ldyBMaXN0ZW5lcigpOwotICAgICAgICAKLSAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9JTlNUQUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuRklYRURfRkFDRVRTX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRUZWFyRG93bk9wZXJhdGlvbgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lciggZnVsbExpc3RlbmVyR2xvYmFsQXBpICk7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAvLyBSdW4gdGhyb3VnaCBhIHNlcmllcyBvZiBvcGVyYXRpb25zLCBjaGVja2luZyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlzdGVuZXJzIGFyZSBzZWVpbmcKLSAgICAgICAgLy8gdGhlIGV4cGVjdGVkIGV2ZW50cy4KLSAgICAgICAgCi0gICAgICAgIGZwai5zZXRGaXhlZFByb2plY3RGYWNldHMoIGFzU2V0KCBmMSwgZjIgKSApOwotICAgICAgICAKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDEgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMSApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDEgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDEgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMSApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDEgKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5tb2RpZnkoIGFzU2V0KCBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMCwgbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjJ2MTEsIG51bGwgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYzdjEyLCBudWxsICkgKSwgbnVsbCApOwotCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAyICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDIgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXAyICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAyICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDIgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAyICk7Ci0gICAgICAgIAotICAgICAgICBmcGouaW5zdGFsbFByb2plY3RGYWNldCggZjR2MTMsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAzICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDMgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXAzICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAzICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDMgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAzICk7Ci0gICAgICAgIAotICAgICAgICBmcGoudW5pbnN0YWxsUHJvamVjdEZhY2V0KCBmM3YxMiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDQgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNCApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDQgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDQgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNCApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDQgKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5zZXRGaXhlZFByb2plY3RGYWNldHMoIGFzU2V0KCBmNCApICk7Ci0gICAgICAgIAotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNSApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA1ICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwNSApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNSApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA1ICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNSApOwotICAgICAgICAKLSAgICAgICAgZnBqLm1vZGlmeSggYXNTZXQoIG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYyMCwgbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGY0djIzLCBudWxsICkgKSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDYgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNiApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDYgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDYgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNiApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKCBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiBldmVudHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCA6IGV2ZW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGV2ZW50LnRvU3RyaW5nKCkgKS5hcHBlbmQoICdcbicgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrKCBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRFdmVudHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbCA9IHRvU3RyaW5nKCBsaXN0ZW5lci5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpICkudHJpbSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZEV2ZW50cy50cmltKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGV4cGVjdGVkLCBhY3R1YWwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdGVuZXIgCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+KCk7Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ldmVudHMuYWRkKCBldmVudCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gcmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiByZXN1bHQgCi0gICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiggdGhpcy5ldmVudHMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5ldmVudHMuY2xlYXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTGlzdGVuZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3RlbmVyIGluc3RhbmNlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gdGhpczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluc3RhbmNlICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gcmV0cmlldmVFdmVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTGlzdGVuZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3RlbmVyIGluc3RhbmNlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gdGhpczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluc3RhbmNlICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gcmV0cmlldmVFdmVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwNTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXA2OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwNTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXA2OwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRXZlbnREZWxpdmVyeVRlc3RzLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2ZkOTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi1mdWxsU3RlcDEgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iRklYRURfRkFDRVRTX0NIQU5HRUQiPlxuXAotXCAgPG9sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8L29sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8bmV3LWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YxIi8+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMiIvPlxuXAotXCAgPC9uZXctZml4ZWQtZmFjZXRzPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLWZ1bGxTdGVwMiA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjEiIHZlcnNpb25cPSIxLjAiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMSIgdmVyc2lvblw9IjEuMCIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjIiIHZlcnNpb25cPSIxLjEiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMiIgdmVyc2lvblw9IjEuMSIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjMiIHZlcnNpb25cPSIxLjIiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMyIgdmVyc2lvblw9IjEuMiIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLWZ1bGxTdGVwMyA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjQiIHZlcnNpb25cPSIxLjMiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mNCIgdmVyc2lvblw9IjEuMyIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLWZ1bGxTdGVwNCA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfVU5JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMyIgdmVyc2lvblw9IjEuMiIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX1VOSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjMiIHZlcnNpb25cPSIxLjIiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1mdWxsU3RlcDUgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iRklYRURfRkFDRVRTX0NIQU5HRUQiPlxuXAotXCAgPG9sZC1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMSIvPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjIiLz5cblwKLVwgIDwvb2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDxuZXctZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjQiLz5cblwKLVwgIDwvbmV3LWZpeGVkLWZhY2V0cz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1mdWxsU3RlcDYgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX1ZFUlNJT05fQ0hBTkdFIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMSIgdmVyc2lvblw9IjIuMCIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX1ZFUlNJT05fQ0hBTkdFIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMSIgdmVyc2lvblw9IjIuMCIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfVkVSU0lPTl9DSEFOR0UiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2Y0IiB2ZXJzaW9uXD0iMi4zIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfVkVSU0lPTl9DSEFOR0UiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2Y0IiB2ZXJzaW9uXD0iMi4zIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotcGFydGlhbFN0ZXAxID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IkZJWEVEX0ZBQ0VUU19DSEFOR0VEIj5cblwKLVwgIDxvbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPC9vbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPG5ldy1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMSIvPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjIiLz5cblwKLVwgIDwvbmV3LWZpeGVkLWZhY2V0cz5cblwKLTwvZXZlbnQ+Ci0KLXBhcnRpYWxTdGVwMiA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjEiIHZlcnNpb25cPSIxLjAiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YyIiB2ZXJzaW9uXD0iMS4xIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMyIgdmVyc2lvblw9IjEuMiIvPlxuXAotPC9ldmVudD4KLQotcGFydGlhbFN0ZXAzID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mNCIgdmVyc2lvblw9IjEuMyIvPlxuXAotPC9ldmVudD4KLQotcGFydGlhbFN0ZXA0ID0gCi0KLXBhcnRpYWxTdGVwNSA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJGSVhFRF9GQUNFVFNfQ0hBTkdFRCI+XG5cCi1cICA8b2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YxIi8+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMiIvPlxuXAotXCAgPC9vbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPG5ldy1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mNCIvPlxuXAotXCAgPC9uZXctZml4ZWQtZmFjZXRzPlxuXAotPC9ldmVudD4KLQotcGFydGlhbFN0ZXA2ID0gCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25Tb3J0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvblNvcnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTdkN2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvblNvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKLXB1YmxpYyBjbGFzcyBGYWNldEFjdGlvblNvcnRUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzVhOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2M7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMmV4dDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMmV4dHYxMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNhOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYXYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2F2MjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2J2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNidjIwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmM2M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNjdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzY3YyMDsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQxIiApOwotICAgICAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjF2MTIgPSBmMS5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICAgICAgZjF2MTIxID0gZjEuZ2V0VmVyc2lvbiggIjEuMi4xIiApOwotICAgICAgICAgICAgZjF2MTMgPSBmMS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICAgICAgZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MiIgKTsKLSAgICAgICAgICAgIGYydjM1ID0gZjIuZ2V0VmVyc2lvbiggIjMuNSIgKTsKLSAgICAgICAgICAgIGYydjM1YSA9IGYyLmdldFZlcnNpb24oICIzLjUjYSIgKTsKLSAgICAgICAgICAgIGYydjQ3ID0gZjIuZ2V0VmVyc2lvbiggIjQuNyIgKTsKLSAgICAgICAgICAgIGYydjQ3YiA9IGYyLmdldFZlcnNpb24oICI0LjcjYiIgKTsKLSAgICAgICAgICAgIGYydjQ3YyA9IGYyLmdldFZlcnNpb24oICI0LjcjYyIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZjJleHQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDJleHQiICk7Ci0gICAgICAgICAgICBmMmV4dHYxMCA9IGYyZXh0LmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2EiICk7Ci0gICAgICAgICAgICBmM2F2MTAgPSBmM2EuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzYXYyMCA9IGYzYS5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgICAgICBmM2IgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNiIiApOwotICAgICAgICAgICAgZjNidjEwID0gZjNiLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2J2MjAgPSBmM2IuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICAgICAgZjNjID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYyIgKTsKLSAgICAgICAgICAgIGYzY3YxMCA9IGYzYy5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNjdjIwID0gZjNjLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIGZhaWx1cmVzLiBUaGlzIGFwaSBpcyB0ZXN0ZWQgZXhwbGljaXRseS4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEZhY2V0QWN0aW9uU29ydFRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkZhY2V0IEFjdGlvbiBTb3J0IFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvblNvcnRUZXN0cyggInRlc3RVbmluc3RhbGxDb21lc0ZpcnN0MSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25Tb3J0VGVzdHMoICJ0ZXN0VW5pbnN0YWxsQ29tZXNGaXJzdDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uU29ydFRlc3RzKCAidGVzdFNvcnRTdGFiaWxpdHkxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvblNvcnRUZXN0cyggInRlc3RTb3J0U3RhYmlsaXR5MiIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBzb3J0IHBsYWNlcyB1bmluc3RhbGwgYWN0aW9ucyBmaXJzdC4gVGhpcyBpcyB0aGUgCi0gICAgICogY29udHJvbCB0ZXN0IGNhc2UuIFRoZSBpbnB1dCBhbHJlYWR5IHBsYWNlcyB1bmluc3RhbGwgZmlyc3QuCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbENvbWVzRmlyc3QxKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMSA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZjNhdjEwLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5hZGQoIGEyICk7Ci0gICAgICAgIGFjdGlvbnMuYWRkKCBhMSApOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuc29ydCggYXNTZXQoIGYzYXYxMCApLCBhY3Rpb25zICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYWN0aW9ucywgYXNMaXN0KCBhMiwgYTEgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBzb3J0IHBsYWNlcyB1bmluc3RhbGwgYWN0aW9ucyBmaXJzdC4gVGhlIHRlc3QgY2FzZSAKLSAgICAgKiBwbGFjZXMgYW4gaW5zdGFsbCBhY3Rpb24gaW4gZnJvbnQgb2YgdGhlIHVuaW5zdGFsbCBhY3Rpb24gYW5kIGNoZWNrcwotICAgICAqIHdoZXRoZXIgdGhlIHNvcnQgYWxnb3JpdGhtIHJldmVyc2VzIHRoZSBvcmRlci4gCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbENvbWVzRmlyc3QyKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMSA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZjNhdjEwLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5hZGQoIGExICk7Ci0gICAgICAgIGFjdGlvbnMuYWRkKCBhMiApOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuc29ydCggYXNTZXQoIGYzYXYxMCApLCBhY3Rpb25zICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYWN0aW9ucywgYXNMaXN0KCBhMiwgYTEgKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHNvcnQgcHJvZHVjZXMgInN0YWJsZSIgcmVzdWx0cyBnaXZlbiB1bnJlbGF0ZWQgZmFjZXRzLgotICAgICAqIFRoaXMgaXMgdGhlIGNvbnRyb2wgdGVzdCBjYXNlLiBUaGUgaW5wdXQgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBvcmRlci4gCi0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydFN0YWJpbGl0eTEoKQotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGExID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGEyID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjNhdjEwLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5hZGQoIGExICk7Ci0gICAgICAgIGFjdGlvbnMuYWRkKCBhMiApOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuc29ydCggQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBhY3Rpb25zICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYWN0aW9ucywgYXNMaXN0KCBhMSwgYTIgKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHNvcnQgcHJvZHVjZXMgInN0YWJsZSIgcmVzdWx0cyBnaXZlbiB1bnJlbGF0ZWQgZmFjZXRzLgotICAgICAqIFRoZSBpbnB1dCBmYWNldHMgYXJlIGluIHRoZSByZXZlcnNlIG9yZGVyLgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdFNvcnRTdGFiaWxpdHkyKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMSA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYzYXYxMCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbnMuYWRkKCBhMiApOwotICAgICAgICBhY3Rpb25zLmFkZCggYTEgKTsKLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLnNvcnQoIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgYWN0aW9ucyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFjdGlvbnMsIGFzTGlzdCggYTEsIGEyICkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25zVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkwNmQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEZhY2V0QWN0aW9uc1Rlc3RzCi0KLSAgICBleHRlbmRzIEFic3RyYWN0VGVzdHMKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmF0X2YxIiApOwotICAgICAgICBmMXYxID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjF2MiA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmFjZXRBY3Rpb25zVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiRmFjZXQgQWN0aW9ucyBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25zVGVzdHMoICJ0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uc1Rlc3RzKCAidGVzdE11bHRpVmVyc2lvbkluc3RhbGwyIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyB0ZXN0IGNhc2VzIHRlc3QgdGhlIHNjZW5hcmlvIHdoZXJlIGRpZmZlcmVudCAKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIElOU1RBTEwgYWN0aW9uIGFyZSBwcm92aWRlZCBmb3IgdHdvIHZlcnNpb25zIG9mIAotICAgICAqIHRoZSBzYW1lIGZhY2V0LgotICAgICAqIAotICAgICAqIFNjZW5hcmlvIFRlc3QgQ29kZToKLSAgICAgKiAKLSAgICAgKiAgIHRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMQotICAgICAqICAgdGVzdE11bHRpVmVyc2lvbkluc3RhbGwyCi0gICAgICogICBGMXYxSW5zdGFsbERlbGVnYXRlCi0gICAgICogICBGMXYySW5zdGFsbERlbGVnYXRlCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpVmVyc2lvbkluc3RhbGwxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gY3JlYXRlRmFjZXRlZFByb2plY3QoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSBmcGouZ2V0UHJvamVjdCgpOwotICAgICAgICBmcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MSwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggRjF2MUluc3RhbGxEZWxlZ2F0ZS5nZXRNYXJrZXJGaWxlKCBwaiApLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBGMXYySW5zdGFsbERlbGVnYXRlLmdldE1hcmtlckZpbGUoIHBqICkuZXhpc3RzKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogPSBjcmVhdGVGYWNldGVkUHJvamVjdCgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdCBwaiA9IGZwai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYyLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggRjF2MUluc3RhbGxEZWxlZ2F0ZS5nZXRNYXJrZXJGaWxlKCBwaiApLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIEYxdjJJbnN0YWxsRGVsZWdhdGUuZ2V0TWFya2VyRmlsZSggcGogKS5leGlzdHMoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEYxdjFJbnN0YWxsRGVsZWdhdGUKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldE1hcmtlckZpbGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRGaWxlKCAidjFtYXJrZXIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGaWxlIG1hcmtlciA9IGdldE1hcmtlckZpbGUoIHByb2plY3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZW1wdHlTdHJlYW0gCi0gICAgICAgICAgICAgICAgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIG5ldyBieXRlWyAwIF0gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWFya2VyLmNyZWF0ZSggZW1wdHlTdHJlYW0sIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEYxdjJJbnN0YWxsRGVsZWdhdGUKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldE1hcmtlckZpbGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRGaWxlKCAidjJtYXJrZXIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGaWxlIG1hcmtlciA9IGdldE1hcmtlckZpbGUoIHByb2plY3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZW1wdHlTdHJlYW0gCi0gICAgICAgICAgICAgICAgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIG5ldyBieXRlWyAwIF0gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWFya2VyLmNyZWF0ZSggZW1wdHlTdHJlYW0sIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRDb25zdHJhaW50c1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRDb25zdHJhaW50c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzkwYjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0Q29uc3RyYWludHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGYWNldENvbnN0cmFpbnRzVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjN2MTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY0OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY0djEwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNXYxMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY2OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djIzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djM3OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djQwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djQ1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmN3YxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmN3YyMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjh2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjh2MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjh2MzA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmOTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmOXYxMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMTB2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjEwdjIwOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjEiICk7Ci0gICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmMyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mMyIgKTsKLSAgICAgICAgZjN2MTAgPSBmMy5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGY0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y0IiApOwotICAgICAgICBmNHYxMCA9IGY0LmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjUiICk7Ci0gICAgICAgIGY1djEwID0gZjUuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmNiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mNiIgKTsKLSAgICAgICAgZjZ2MTAgPSBmNi5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmNnYyMyA9IGY2LmdldFZlcnNpb24oICIyLjMiICk7Ci0gICAgICAgIGY2djM3ID0gZjYuZ2V0VmVyc2lvbiggIjMuNyIgKTsKLSAgICAgICAgZjZ2NDAgPSBmNi5nZXRWZXJzaW9uKCAiNC4wIiApOwotICAgICAgICBmNnY0NSA9IGY2LmdldFZlcnNpb24oICI0LjUiICk7Ci0KLSAgICAgICAgZjcgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjciICk7Ci0gICAgICAgIGY3djEwID0gZjcuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjd2MjAgPSBmNy5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgIGY4ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y4IiApOwotICAgICAgICBmOHYxMCA9IGY4LmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGY4djIwID0gZjguZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgZjh2MzAgPSBmOC5nZXRWZXJzaW9uKCAiMy4wIiApOwotCi0gICAgICAgIGY5ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y5IiApOwotICAgICAgICBmOXYxMCA9IGY5LmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjEwID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2YxMCIgKTsKLSAgICAgICAgZjEwdjEwID0gZjEwLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGYxMHYyMCA9IGYxMC5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEZhY2V0Q29uc3RyYWludHNUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJGYWNldCBDb25zdHJhaW50IFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0MiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3QzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0NSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3Q2IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDciICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0OCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdFJlcXVpcmVzV2l0aE5vVmVyc2lvbiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdFJlcXVpcmVzV2l0aFVua25vd25WZXJzaW9uIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0R3JvdXBSZXF1aXJlcyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEdyb3VwUmVxdWlyZXNTb2Z0IiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgY29uZmxpY3QgZGV0ZWN0aW9uIGNvZGUgcGlja3MgdXAgb24gYW4gaW5kaXJlY3QKLSAgICAgKiBjb25mbGljdC4gQWxzbyB0ZXN0cyB0aGF0IGEgc29mdCBjb25zdHJhaW50IGlzIG5vdCB1c2VkIHRvIGZsYWcgYQotICAgICAqIGNvbmZsaWN0LgotICAgICAqIAotICAgICAqIEhlcmUgaXMgdGhlIHJlbGF0aW9uc2hpcCBkaWFncmFtIGJldHdlZW4gdGhlIGZpdmUgZmFjZXRzIGludm9sdmVkIGluIAotICAgICAqIHRoaXMgdGVzdDogCi0gICAgICogCi0gICAgICogICAgICAgICAgIGNvbmZsaWN0cyAgICAgICAgICAgIHJlcXVpcmVzCi0gICAgICogICBmMSAtLS0tLS0tLS0tLS0tLS0tPiBmMiA8LS0tLS0tLS0tLS0tLS0tLSBmMwotICAgICAqICAgZjQgPC0tLS0tLS0tLS0tLS0tLS0gICAgPC0tLS0tLS0tLS0tLS0tLS0gZjUKLSAgICAgKiAgICAgICAgICAgY29uZmxpY3RzICAgICAgICAgc29mdCByZXF1aXJlcwotICAgICAqIAotICAgICAqIFRoZXNlIGNhc2Ugc2hvdWxkIGNvbWUgYmFjayBwb3NpdGl2ZSBmb3IgY29uZmxpY3Q6Ci0gICAgICogCi0gICAgICogICBmMSB3aXRoIGYzCi0gICAgICogICBmMyB3aXRoIGYxCi0gICAgICogICBmNCB3aXRoIGYzCi0gICAgICogICBmMyB3aXRoIGY0Ci0gICAgICogICAKLSAgICAgKiBUaGVzZSBjYXNlIHNob3VsZCBjb21lIGJhY2sgbmVnYXRpdmUgZm9yIGNvbmZsaWN0OgotICAgICAqIAotICAgICAqICAgZjEgd2l0aCBmNQotICAgICAqICAgZjUgd2l0aCBmMQotICAgICAqICAgZjQgd2l0aCBmNQotICAgICAqICAgZjUgd2l0aCBmNAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0MSgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMC5jb25mbGljdHNXaXRoKCBmM3YxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0MigpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmM3YxMC5jb25mbGljdHNXaXRoKCBmMXYxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3QzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGY0djEwLmNvbmZsaWN0c1dpdGgoIGYzdjEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjN2MTAuY29uZmxpY3RzV2l0aCggZjR2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYxdjEwLmNvbmZsaWN0c1dpdGgoIGY1djEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3Q2KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmNXYxMC5jb25mbGljdHNXaXRoKCBmMXYxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3Q3KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmNHYxMC5jb25mbGljdHNXaXRoKCBmNXYxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3Q4KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmNXYxMC5jb25mbGljdHNXaXRoKCBmNHYxMCApICk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdHMgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50OgotICAgICAqIAotICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjYiLz4KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlc1dpdGhOb1ZlcnNpb24oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MjMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYzNyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djQwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2NDUgKSApLmlzT0soKSApOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludCB0aGF0IHNwZWNpZmllcyB2ZXJzaW9ucyB0aGF0IGRvbid0IGV4aXN0OgotICAgICAqIAotICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249Ils1LjAtNi41KSIvPgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVzV2l0aFVua25vd25WZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MjMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MzcgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2NDAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2NDUgKSApLmlzT0soKSApOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3RzIHRoZSAicmVxdWlyZXMgYW55IGdyb3VwIG1lbWJlciIgY29uc3RyYWludDoKLSAgICAgKiAKLSAgICAgKiAgIDxyZXF1aXJlcyBncm91cD0iZmN0X2cxIi8+Ci0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBSZXF1aXJlcygpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MzAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjl2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRlc3RzIHRoZSBzb2Z0IHZlcnNpb24gb2YgdGhlICJyZXF1aXJlcyBhbnkgZ3JvdXAgbWVtYmVyIiBjb25zdHJhaW50OgotICAgICAqIAotICAgICAqICAgPHJlcXVpcmVzIGdyb3VwPSJmY3RfZzEiIHNvZnQ9InRydWUiLz4KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cFJlcXVpcmVzU29mdCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djMwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY5djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldGVkUHJvamVjdEZyYW1ld29ya0NvcmVUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrQ29yZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjYyZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrQ29yZVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtDb3JlVGVzdHNQbHVnaW4KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJlc2V0c1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJlc2V0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzAyZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1ByZXNldHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjF2MTIxOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYxdjIwOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYyZXh0djEwOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYydjM1YTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mM2F2MTA7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjNidjEwOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYzY3YxMDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUR5bmFtaWNQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5QcmVzZXREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmVzZXRzVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIFByZXNldHNUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJQcmVzZXRzIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0U2ltcGxlU3RhdGljUHJlc2V0cyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdERlcml2ZWRTdGF0aWNQcmVzZXRzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0RHluYW1pY1ByZXNldHMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3RTdGF0aWNQcmVzZXRzRXh0ZW5kaW5nRHluYW1pY1ByZXNldHMxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0U3RhdGljUHJlc2V0c0V4dGVuZGluZ0R5bmFtaWNQcmVzZXRzMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdFVzZXJEZWZpbmVkUHJlc2V0cyIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RhdGljUHJlc2V0cygpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9wcmVzZXQxIiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0MSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X3ByZXNldDEiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0MSApICk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0MS5nZXRJZCgpLCAicHRfcHJlc2V0MSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQxLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDEuZ2V0TGFiZWwoKSwgIlByZXNldCAxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDEuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZmlyc3QgcHJlc2V0LiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQxLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjIwLCBmMnYzNWEsIGYyZXh0djEwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3ByZXNldDIiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfcHJlc2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQyICkgKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQyLmdldElkKCksICJwdF9wcmVzZXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDIuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0Mi5nZXRMYWJlbCgpLCAicHRfcHJlc2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQyLmdldERlc2NyaXB0aW9uKCksICIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0Mi5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmM2F2MTAsIGYzYnYxMCwgZjNjdjEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVyaXZlZFN0YXRpY1ByZXNldHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfcHJlc2V0MyIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldDMgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9wcmVzZXQzIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldDMgKSApOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDMuZ2V0SWQoKSwgInB0X3ByZXNldDMiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0My5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQzLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjEyMSwgZjJ2MzVhLCBmMmV4dHYxMCwgZjNhdjEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X2R5bl9wcmVzZXQiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9keW5fcHJlc2V0IiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldCApICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0SWQoKSwgInB0X2R5bl9wcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFR5cGUoKSwgSVByZXNldC5UeXBlLkRZTkFNSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0TGFiZWwoKSwgInB0X2R5bl9wcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldERlc2NyaXB0aW9uKCksICIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFByb2plY3RGYWNldHMoKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUR5bmFtaWNQcmVzZXQgZHluYW1pY1ByZXNldCA9IChJRHluYW1pY1ByZXNldCkgcHJlc2V0OwotICAgICAgICBmaW5hbCBJUHJlc2V0IHJlc29sdmVkID0gZHluYW1pY1ByZXNldC5yZXNvbHZlKCBDb2xsZWN0aW9ucy48U3RyaW5nLE9iamVjdD5lbXB0eU1hcCgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldElkKCksICJwdF9keW5fcHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldExhYmVsKCksICJEeW5hbWljIFByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXREZXNjcmlwdGlvbigpLCAiVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkeW5hbWljIHByZXNldC4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MjAsIGYyZXh0djEwLCBmM2N2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljUHJlc2V0c0V4dGVuZGluZ0R5bmFtaWNQcmVzZXRzMSgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0ICkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRJZCgpLCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5EWU5BTUlDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldExhYmVsKCksICJTdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24uIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElEeW5hbWljUHJlc2V0IGR5bmFtaWNQcmVzZXQgPSAoSUR5bmFtaWNQcmVzZXQpIHByZXNldDsKLSAgICAgICAgZmluYWwgSVByZXNldCByZXNvbHZlZCA9IGR5bmFtaWNQcmVzZXQucmVzb2x2ZSggQ29sbGVjdGlvbnMuPFN0cmluZyxPYmplY3Q+ZW1wdHlNYXAoKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRJZCgpLCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldExhYmVsKCksICJTdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbi4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MjAsIGYyZXh0djEwLCBmM2N2MTAsIGYydjM1YSwgZjNidjEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljUHJlc2V0c0V4dGVuZGluZ0R5bmFtaWNQcmVzZXRzMigpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzIiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0ICkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRJZCgpLCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8yIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5EWU5BTUlDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldExhYmVsKCksICJTdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0IDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbiAyLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRHluYW1pY1ByZXNldCBkeW5hbWljUHJlc2V0ID0gKElEeW5hbWljUHJlc2V0KSBwcmVzZXQ7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcmVzb2x2ZWQgPSBkeW5hbWljUHJlc2V0LnJlc29sdmUoIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0SWQoKSwgInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRMYWJlbCgpLCAiU3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldCAyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbiAyLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYxMjEsIGYyZXh0djEwLCBmM2N2MTAsIGYydjM1YSwgZjNidjEwLCBmM2F2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlckRlZmluZWRQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF91c2VyX2RlZmluZWQiICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0Ci0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmRlZmluZVByZXNldCggInB0X3VzZXJfZGVmaW5lZCIsICJ0aGUgZGVzY3JpcHRpb24iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIxLCBmMmV4dHYxMCApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoIHByZXNldC5nZXRJZCgpICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQgKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlVTRVJfREVGSU5FRCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRMYWJlbCgpLCAicHRfdXNlcl9kZWZpbmVkIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXREZXNjcmlwdGlvbigpLCAidGhlIGRlc2NyaXB0aW9uIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYxMjEsIGYyZXh0djEwICkgKTsKLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLmRlbGV0ZVByZXNldCggcHJlc2V0ICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF91c2VyX2RlZmluZWQiICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVzZXRGYWN0b3J5IAotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElQcmVzZXRGYWN0b3J5Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIFByZXNldERlZmluaXRpb24gY3JlYXRlUHJlc2V0KCBmaW5hbCBTdHJpbmcgcHJlc2V0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKSAKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJlc2V0RGVmaW5pdGlvbiggIkR5bmFtaWMgUHJlc2V0IiwgIlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZHluYW1pYyBwcmVzZXQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjIwLCBmMmV4dHYxMCwgZjNjdjEwICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0Y2NlOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLnJlYWRGcm9tRmlsZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMud2FpdEZvckNvbmRpdGlvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMud3JpdGVUb0ZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLklDb25kaXRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cwotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRlc3RzCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0ZJTEUgCi0gICAgICAgID0gIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1RfTkFNRSA9ICJ0ZXN0UHJvamVjdCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMDsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MSIgKTsKLSAgICAgICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYxdjEyID0gZjEuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgICAgIGYxdjEyMSA9IGYxLmdldFZlcnNpb24oICIxLjIuMSIgKTsKLSAgICAgICAgICAgIGYxdjEzID0gZjEuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgICAgIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgZmFpbHVyZXMuIFRoaXMgYXBpIGlzIHRlc3RlZCBleHBsaWNpdGx5LgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVByb2plY3QgcGo7Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgZnBqOwotICAgIHByaXZhdGUgSUZpbGUgbWRmaWxlOwotCi0gICAgcHJpdmF0ZSBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJQcm9qZWN0IENoYW5nZSBSZWFjdGlvbiBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMoICJ0ZXN0UmVhY3Rpb25Ub1Byb2plY3REZWxldGUiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzKCAidGVzdFJlYWN0aW9uVG9NZXRhZGF0YUZpbGVEZWxldGUiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzKCAidGVzdFJlYWN0aW9uVG9NZXRhZGF0YUZpbGVDaGFuZ2UiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggVEVTVF9QUk9KRUNUX05BTUUgKS5leGlzdHMoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIFRFU1RfUFJPSkVDVF9OQU1FLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnBqID0gdGhpcy5mcGouZ2V0UHJvamVjdCgpOwotICAgICAgICBhZGRSZXNvdXJjZVRvQ2xlYW51cCggdGhpcy5waiApOwotICAgICAgICBhc3NlcnRUcnVlKCB0aGlzLmZwai5nZXRQcm9qZWN0KCkuZXhpc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEyLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggdGhpcy5mcGouZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MTIgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5tZGZpbGUgPSB0aGlzLnBqLmdldEZpbGUoIE1FVEFEQVRBX0ZJTEUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWN0aW9uVG9Qcm9qZWN0RGVsZXRlKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLnBqLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY3JlYXRlTm9GYWNldHNDb25kaXRpb24oIHRoaXMuZnBqICkgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCB0aGlzLnBqICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMiwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZnlDYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdEV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGouc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBhc1NldCggZjEgKSApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZnlDYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdEV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGouc2V0VGFyZ2V0ZWRSdW50aW1lcyggQ29sbGVjdGlvbnMuPElSdW50aW1lPmVtcHR5U2V0KCksIG51bGwgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZ5Q2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3RFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwai5zZXRQcmltYXJ5UnVudGltZSggbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZnlDYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdEV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdEV4Y2VwdGlvbiggZmluYWwgQ29yZUV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSAiQ2Fubm90IG1vZGlmeSBhIGRlbGV0ZWQgcHJvamVjdC4iOwotICAgICAgICBhc3NlcnRUcnVlKCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKS5lcXVhbHMoIGV4cGVjdGVkTWVzc2FnZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWN0aW9uVG9NZXRhZGF0YUZpbGVEZWxldGUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMubWRmaWxlLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotCi0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNyZWF0ZU5vRmFjZXRzQ29uZGl0aW9uKCB0aGlzLmZwaiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWN0aW9uVG9NZXRhZGF0YUZpbGVDaGFuZ2UoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBTdHJpbmcgY29udGVudHM7Ci0gICAgICAgIAotICAgICAgICBjb250ZW50cyA9IHJlYWRGcm9tRmlsZSggdGhpcy5tZGZpbGUgKTsKLSAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlRmlyc3QoICIxLjIiLCAiMi4wIiApOwotICAgICAgICB3cml0ZVRvRmlsZSggdGhpcy5tZGZpbGUsIGNvbnRlbnRzICk7Ci0gICAgICAgIAotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjcmVhdGVGYWNldENvbmRpdGlvbiggdGhpcy5mcGosIGYxdjIwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZUZpcnN0KCAiMi4wIiwgIjEuMi4xIiApOwotICAgICAgICB3cml0ZVRvRmlsZSggdGhpcy5tZGZpbGUsIGNvbnRlbnRzICk7Ci0gICAgICAgIAotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjcmVhdGVGYWNldENvbmRpdGlvbiggdGhpcy5mcGosIGYxdjEyMSApICk7Ci0gICAgICAgIAotICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2VGaXJzdCggIjxpbnN0YWxsZWQgZmFjZXQ9XCJmYWNldDFcIiB2ZXJzaW9uPVwiMS4yLjFcIi8+IiwgIiIgKTsKLSAgICAgICAgd3JpdGVUb0ZpbGUoIHRoaXMubWRmaWxlLCBjb250ZW50cyApOwotICAgICAgICAKLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY3JlYXRlTm9GYWNldHNDb25kaXRpb24oIHRoaXMuZnBqICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNvbmRpdGlvbiBjcmVhdGVOb0ZhY2V0c0NvbmRpdGlvbiggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElDb25kaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVjaygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZwai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpID09IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElDb25kaXRpb24gY3JlYXRlRmFjZXRDb25kaXRpb24oIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJQ29uZGl0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2soKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmcGouaGFzUHJvamVjdEZhY2V0KCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q3JlYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDcmVhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDJlNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDcmVhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RDcmVhdGlvblRlc3RzCi0KLSAgICBleHRlbmRzIEFic3RyYWN0VGVzdHMKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRFRF9QUk9KRUNUX05BVFVSRQotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5uYXR1cmUiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MTsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAicGN0LWYxIiApOwotICAgICAgICBmMXYxID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggInBjdC1mMiIgKTsKLSAgICAgICAgZjJ2MSA9IGYyLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9qZWN0Q3JlYXRpb25UZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJQcm9qZWN0IENyZWF0aW9uIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21TY3JhdGNoNCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3Q0IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RXcmFwcGVyQ3JlYXRpb24xIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RXcmFwcGVyQ3JlYXRpb24yIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RXcmFwcGVyQ3JlYXRpb24zIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKFN0cmluZyxJUGF0aCxJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8sIHRoZXJlIGlzIG5vIHByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBmcHJvai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKCBwcm9qICk7Ci0gICAgICAgIGFzc2VydFRydWUoIHByb2ouZXhpc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvaiApOwotICAgICAgICAKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEZpbGVDb250YWlucyggcHJvai5nZXRGaWxlKCAiLnByb2plY3QiICksIEZBQ0VURURfUFJPSkVDVF9OQVRVUkUgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFRhcmdldGVkUnVudGltZXMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoU3RyaW5nLElQYXRoLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbywgdGhlcmUgaXMgYSBmYWNldGVkIHByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIGZwcm9qLmdldFByb2plY3QoKSApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShTdHJpbmcsSVBhdGgsSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGVyZSBpcyBhIG5vbi1mYWNldGVkIHByb2plY3Qgd2l0aCB0aGUgc2FtZQotICAgICAqIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCAiYWJjIiApOwotICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB3cy5uZXdQcm9qZWN0RGVzY3JpcHRpb24oICJhYmMiICk7Ci0KLSAgICAgICAgZGVzYy5zZXRMb2NhdGlvbiggbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgbnVsbCApOwotICAgICAgICBwcm9qZWN0Lm9wZW4oIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShTdHJpbmcsSVBhdGgsSVByb2dyZXNzTW9uaXRvcil9IG1ldGhvZC4gSW4gdGhpcyAKLSAgICAgKiBzY2VuYXJpbywgdGhlcmUgd2FzIHByZXZpb3VzbHkgYSBmYWNldGVkIHByb2plY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gVGhlIHRlc3QgCi0gICAgICogdmVyaWZpZXMgdGhhdCBwcmV2aW91c2x5LWluc3RhbGxlZCBmYWNldHMgYXJlIHJlY29nbml6ZWQgYWZ0ZXIgdGhlIHByb2plY3QgaXMgcmVzdXJyZWN0ZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21TY3JhdGNoNCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qOwotICAgICAgICAKLSAgICAgICAgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggZnByb2ouZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgIAotICAgICAgICBmcHJvai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGZwcm9qLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYydjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZwcm9qLmdldFByb2plY3QoKS5kZWxldGUoIGZhbHNlLCBmYWxzZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ouaGFzUHJvamVjdEZhY2V0KCBmMXYxICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ouaGFzUHJvamVjdEZhY2V0KCBmMnYxICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0LGJvb2xlYW4sSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvIHByb2plY3QgaXMgbm90IGZhY2V0ZWQgYW5kIGNvbnZlcnRJZk5lY2Vzc2FyeQotICAgICAqIGlzIHNldCB0byB0cnVlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoICJhYmMiICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdzLm5ld1Byb2plY3REZXNjcmlwdGlvbiggImFiYyIgKTsKLSAgICAKLSAgICAgICAgZGVzYy5zZXRMb2NhdGlvbiggbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgbnVsbCApOwotICAgICAgICBwcm9qZWN0Lm9wZW4oIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnROdWxsKCBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0LGJvb2xlYW4sSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvIHByb2plY3QgaXMgZmFjZXRlZCBhbmQgY29udmVydElmTmVjZXNzYXJ5Ci0gICAgICogaXMgc2V0IHRvIHRydWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcmlvciAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByaW9yLmdldFByb2plY3QoKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnROdWxsKCBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCxib29sZWFuLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbyBwcm9qZWN0IGlzIGZhY2V0ZWQgYW5kIGNvbnZlcnRJZk5lY2Vzc2FyeQotICAgICAqIGlzIHNldCB0byBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IHByaW9yIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcHJpb3IuZ2V0UHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2oKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0LCBmYWxzZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnROdWxsKCBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCxib29sZWFuLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbyBwcm9qZWN0IGlzIG5vdCBmYWNldGVkIGFuZCBjb252ZXJ0SWZOZWNlc3NhcnkKLSAgICAgKiBpcyBzZXQgdG8gZmFsc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDQoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggImFiYyIgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd3MubmV3UHJvamVjdERlc2NyaXB0aW9uKCAiYWJjIiApOwotICAgIAotICAgICAgICBkZXNjLnNldExvY2F0aW9uKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Qub3BlbiggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QsIGZhbHNlLCBudWxsICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0KX0gbWV0aG9kLiBUaGlzIHNjZW5hcmlvCi0gICAgICogdmFsaWRhdGVzIHRoYXQgdGhlIHdyYXBwZXIgY2FjaGUgaXMgd29ya2luZyBhbmQgdGhlIHNhbWUgaW5zdGFuY2UgaXMKLSAgICAgKiByZXR1cm5lZCB3aGVuIHRoZSBjcmVhdGUgbWV0aG9kIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNyZWF0aW9uMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qID0gZnByb2ouZ2V0UHJvamVjdCgpOwotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2ogKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qID09IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qID09IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qID09IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qID09IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qID09IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0KX0gbWV0aG9kLiBJbiB0aGlzCi0gICAgICogc2NlbmFyaW8sIHRoZSBpbnB1dCBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyQ3JlYXRpb24yKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qID0gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoICJhYmMiICk7Ci0gICAgICAgIGFzc2VydE51bGwoIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0KX0gbWV0aG9kLiBJbiB0aGlzCi0gICAgICogc2NlbmFyaW8sIHRoZSBpbnB1dCBwcm9qZWN0IGlzIGNsb3NlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNyZWF0aW9uMygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qID0gZnByb2ouZ2V0UHJvamVjdCgpOwotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2ogKTsKLSAgICAgICAgCi0gICAgICAgIHByb2ouY2xvc2UoIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwoIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0N1c3RvbVZlcnNpb25Db21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjA4ZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IKLQotICAgIGV4dGVuZHMgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yCi0gICAgCi17Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXBhcmF0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiLiMiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ29tcGFyYWJsZSBwYXJzZSggZmluYWwgU3RyaW5nIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb24gKQotICAgIAotICAgICAgICB0aHJvd3MgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBwb3NpdGlvbiA9PSAyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnZlcnRlciggc2VnbWVudCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlKCB2ZXJzaW9uLCBzZWdtZW50LCBwb3NpdGlvbiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52ZXJ0ZXIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhYmxlCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhYmxlIGJhc2U7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSW52ZXJ0ZXIoIGZpbmFsIENvbXBhcmFibGUgYmFzZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhICggb2JqIGluc3RhbmNlb2YgSW52ZXJ0ZXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZXF1YWxzKCAoIChJbnZlcnRlcikgb2JqICkuYmFzZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMSAqIHRoaXMuYmFzZS5jb21wYXJlVG8oICggKEludmVydGVyKSBvYmogKS5iYXNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MUluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxSW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2FmNzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxSW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDFJbnN0YWxsRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDEudHh0IiApOwotICAgICAgICBUZXN0VXRpbHMud3JpdGVUb0ZpbGUoIGZpbGUsIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM2NzcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDFVbmluc3RhbGxEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0MS50eHQiICk7Ci0gICAgICAgIGZpbGUuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNGUwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0MS50eHQiICk7Ci0gICAgICAgIFRlc3RVdGlscy53cml0ZVRvRmlsZSggZmlsZSwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYUluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYUluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRkN2YyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0M2FJbnN0YWxsRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDNhLnR4dCIgKTsKLSAgICAgICAgVGVzdFV0aWxzLndyaXRlVG9GaWxlKCBmaWxlLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVhMTA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQzYVVuaW5zdGFsbERlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQzYS50eHQiICk7Ci0gICAgICAgIGZpbGUuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDdjODZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0M2FWZXJzaW9uQ2hhbmdlRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDNhLnR4dCIgKTsKLSAgICAgICAgVGVzdFV0aWxzLndyaXRlVG9GaWxlKCBmaWxlLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9Ob09wRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L05vT3BEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDJmM2JhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L05vT3BEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9PcERlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9UZXN0VXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMThjZWU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RVdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZSggZmluYWwgSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50cyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGNvbnRlbnRzLmdldEJ5dGVzKCAiVVRGLTgiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaWxlLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlLnNldENvbnRlbnRzKCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIGJ5dGVzICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZS5jcmVhdGUoIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggYnl0ZXMgKSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkRnJvbUZpbGUoIGZpbmFsIElGaWxlIGZpbGUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCBmaWxlLmV4aXN0cygpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmaW5hbCBSZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggZmlsZS5nZXRDb250ZW50cygpICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbIDEwMjQgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgY291bnQ7ICggY291bnQgPSByLnJlYWQoIGNoYXJzICkgKSAhPSAtMTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGNoYXJzLCAwLCBjb3VudCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoIGZpbmFsIElGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkQ29udGVudHMgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIHJlYWRGcm9tRmlsZSggZmlsZSApLCBleHBlY3RlZENvbnRlbnRzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRGaWxlQ29udGFpbnMoIGZpbmFsIElGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0ciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIHJlYWRGcm9tRmlsZSggZmlsZSApLmluZGV4T2YoIHN0ciApICE9IC0xICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQ29uZGl0aW9uKCBmaW5hbCBJQ29uZGl0aW9uIGNvbmRpdGlvbiApCi0gICAgewotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjb25kaXRpb24sIDEwICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQ29uZGl0aW9uKCBmaW5hbCBJQ29uZGl0aW9uIGNvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlY29uZHMgKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzZWNvbmRzICYmICEgY29uZGl0aW9uLmNoZWNrKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCggMTAwMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCBjb25kaXRpb24uY2hlY2soKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQ29uZGl0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGNoZWNrKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBhc1NldCggZmluYWwgVC4uLiBvYmplY3RzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxUPiBzZXQgPSBuZXcgTGlua2VkSGFzaFNldDxUPigpOwotICAgICAgICBzZXQuYWRkQWxsKCBBcnJheXMuYXNMaXN0KCBvYmplY3RzICkgKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWIzNDNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQotICA8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0gIDxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotICAKLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICAKLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfSoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0id3N0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93c3RfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d3N0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkFsbFRlc3RzIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICAKLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmYWM0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIudGVzdHMuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1ZDMxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNWYxYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBGZWIgMDIgMTY6NTE6MzkgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIwYjVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lOiBGYWNldCBVSSBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjAucXVhbGlmaWVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzCi1CdW5kbGUtQ2xhc3NQYXRoOiB0ZXN0cy5qYXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2RmM2RiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpbWFnZXMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB0ZXN0cy5qYXIKLXNvdXJjZS50ZXN0cy5qYXIgPSBzcmMvCi1vdXRwdXQudGVzdHMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2ltYWdlcy91bmtub3duLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9pbWFnZXMvdW5rbm93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2M2YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2ltYWdlcy91bmtub3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzNzBmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBGYWNldCBVSSBUZXN0cyBQbHVnLWluCi13aXphcmQubmFtZS4wID0gRmFjZXRlZCBQcm9qZWN0IFRlc3QgV2l6YXJkCi13aXphcmQuZGVzY3JpcHRpb24uMCA9IFRoaXMgd2l6YXJkIGlzIHVzZWQgdG8gdGVzdCB0aGUgRmFjZXRlZCBQcm9qZWN0IFdpemFyZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2MwZjZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLQotPHBsdWdpbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gICAgCi0gICAgPGNhdGVnb3J5IGlkPSJ1aS5jYXRlZ29yeSI+Ci0gICAgICA8bGFiZWw+VUkgVGVzdCBDYXRlZ29yeTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5PgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InVpLmYxIj4KLSAgICAgIDxsYWJlbD5GYWNldCAxPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmYWNldDEuPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9InVpLmNhdGVnb3J5Ii8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0idWkuZjEiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJ1aS5mMiI+Ci0gICAgICA8bGFiZWw+RmFjZXQgMjwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgZmFjZXQyLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJ1aS5jYXRlZ29yeSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InVpLmYyIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHRlbXBsYXRlIGlkPSJ1aS5iYXNlLndpemFyZC50ZW1wbGF0ZSI+Ci0gICAgICA8bGFiZWw+RmFjZXRlZCBQcm9qZWN0PC9sYWJlbD4KLSAgICA8L3RlbXBsYXRlPgotICAgIAotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIAotICAgICAgICBuYW1lPSIld2l6YXJkLm5hbWUuMCIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy5UZXN0UHJvamVjdFdpemFyZCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy5UZXN0UHJvamVjdFdpemFyZCIKLSAgICAgICAgaWNvbj0iaW1hZ2VzL3Vua25vd24uZ2lmIgotICAgICAgICBwcm9qZWN0PSJ0cnVlIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICV3aXphcmQuZGVzY3JpcHRpb24uMAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvdGVzdHMvVGVzdFByb2plY3RXaXphcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL3Rlc3RzL1Rlc3RQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZjEyMmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvdGVzdHMvVGVzdFByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5GYWNldGVkUHJvamVjdFdpemFyZDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RQcm9qZWN0V2l6YXJkCi0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0V2l6YXJkCi0gICAgCi17Ci0gICAgcHVibGljIFRlc3RQcm9qZWN0V2l6YXJkKCkKLSAgICB7Ci0gICAgICAgIHNldENhdGVnb3J5RXhwYW5kZWRTdGF0ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcnkoICJ1aS5jYXRlZ29yeSIgKSwgdHJ1ZSApOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZURlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiVGhpcyB3aXphcmQgaXMgdXNlZCB0byB0ZXN0IHRoZSBGYWNldGVkIFByb2plY3QgV2l6YXJkLiI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSggInVpLmJhc2Uud2l6YXJkLnRlbXBsYXRlIiApOwotICAgIH0KLQotfQo=